11.线程间的通信:什么是锁池和等待池???线程间的通信有哪三个常用方法???
学习:第7遍
1.什么是锁池和等待池???线程间的通信有哪些常见相关方法???
Java中任何一个对象都自带锁、锁池和等待池三个东西
锁池: 当线程执行synchronized块时如果无法获取特定对象上的锁,此时会进入该对象的锁池 当锁被归还给该对象时,锁池中的多个线程会竞争获取该对象的锁 获取对象锁的线程将执行synchronized块,执行完毕后会释放锁
等待池: 当线程获取对象的锁后,可以调用 wait() 方法放弃锁,此时会进入该对象的等待池 当其他线程调用该对象的 notify() 或 notifyAll() 方法时,等待池中的线程会被唤醒,会进入该对 象的锁池 当线程获取对象的锁后,将从它上次调用wait()方法的位置开始继续运行
2.线程间的通信有哪三个常用方法???
方法一:thread.wait(2000) //可以设置等待的超时时间 作用:使线程放弃对象锁,线程进入等待池 可以调用等待超时时间,超时后线程会自动唤醒
方法二:thread.notify() 作用:随机唤醒等待池中的一个线程,线程进入锁池 唤醒的是特定对象的等待池中的线程
方法三:thread.notifyAll() 作用:唤醒等待池中的所有线程
注意: 这三个方法都只能在synchronized块中使用,即只有获取了锁的线程才能调用 等待和唤醒必须使用的是同一个对象
public class Test{
public static void main(String
[] args
) {
Object obj
= new Object();
WaitThread w
= new WaitThread(obj
);
w
.start();
try {
Thread
.sleep(3000);
} catch (InterruptedException e
) {
e
.printStackTrace();
}
NotifyThread n
= new NotifyThread(obj
);
n
.start();
}
}
class WaitThread extends Thread {
private Object obj
;
public WaitThread(Object obj
){
this.obj
=obj
;
}
@Override
public void run() {
System
.out
.println(111);
synchronized (obj
) {
try {
System
.out
.println(getName() + "释放锁,即将进入等待池。。。。");
obj
.wait();
} catch (InterruptedException e
) {
System
.out
.println(getName()+"被中断。。。。");
}
}
System
.out
.println(222);
}
}
class NotifyThread extends Thread{
private Object obj
;
public NotifyThread(Object obj
){
this.obj
=obj
;
}
@Override
public void run() {
synchronized (obj
) {
obj
.notifyAll();
System
.out
.println(getName()+"已唤醒等待池中的线程。。。。。");
}
}
}