join()是等待线程结束。
wait是等待线程通知,并不一定是执行结束。能更加精细的控制线程执行的顺序。
在什么情况下使用线程等待通知呢?
“线程饿死问题”,一个线程频繁的获取锁和释放锁,由于获取锁的速度太快,其他的线程抢不到,那么就会影响到代码的执行速度。
而等待通知机制就能够解决上述问题:
通过条件判定当前逻辑是否能执行,如果不能执行就主动wait,把执行机会留给其他线程。等到时机成熟后,再由其他线程进行唤醒,进行线程的抢占执行
注意:1.wait是Object类提供的方法,任何对象都可以使用这个方法。
2.wait内部做的不仅仅是阻塞等待,还有解锁,那就是说先有锁才能谈释放,wait必须放到synchronized内部使用
public class demo2 {
public static void main(String[] args) throws InterruptedException {
Object locker=new Object();
Thread t1=new Thread(()->{
synchronized (locker){
System.out.println("t1等待之前");
try {
locker.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("t1等待之后");
}
});
Thread t2=new Thread(()->{
Scanner scanner=new Scanner(System.in);
synchronized (locker){
System.out.print("请输入一个数字:");
scanner.next();
locker.notify();
}
});
t1.start();
t2.start();
}
}
在上述代码中,由于t2线程需要打开输入资源流,所以t1大概率比t2先拿到锁,当t1拿到锁后t1执行wait,t1线程释放锁,然后执行t2线程。等到t2线程来唤醒t1线程的时候,线程t1进入就绪状态,当t2释放锁后,拿到锁继续执行。但是当t2线程先执行那么notify无效。t1线程不能被唤醒执行
标签:通知,t2,t1,线程,new,执行,等待,wait From: https://blog.csdn.net/2301_78864183/article/details/137428795