一.等待唤醒机制(wait,notify,notifyAll)
1.基本概念
wait:将同步线程处于冻结状态,释放执行权,同时将线程对象存储到线程池
notify:唤醒线程池中某个等待线程
notifyAll:唤醒线程池中所有线程
2.注意
(1)这些方法都需要定义在同步中
(2)这些方法必须要标示所属的锁
(3)为什么这三个方法要被定义在object中?因为这三个方法都需要被同步锁调用,而锁可以是任意对象,那么能被任意对象调用的方法一定在Object类中
3.wait和sleep的区别?
(1)wait可以指定时间,也可以不指定时间,不指定时间只能由notify或notifyAll唤醒,sleep必须指定时间
(2)wait线程会释放执行权和锁,sleep只会释放执行权,不会释放锁
public class Demo3 {
private volatile int signal;
public void set(int signal) {
this.signal = signal;
}
public int get(){
return signal;
}
public static void main(String[] args) {
Demo3 d = new Demo3();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (d){
System.out.println("修改状态的线程执行...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
d.set(1);
d.notify();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (d){
while (d.get() != 1){
try {
d.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("模拟代码执行...");
}
}
}).start();
}
}
二.加塞线程 join
B.join():在线程A中调用B.join,直到线程B结束之后才会调用线程A
B.join(1000):线程A等待线程B执行一秒后继续进入可运行状态