2026/2/19 14:53:30
网站建设
项目流程
地区门户网站 wap app,安徽津城建设工程有限公司网站,建设工程合同无效的情形,菲斯曼售后服务中心wait和notify是协调线程之间执行逻辑的顺序的功能#xff0c;他和join和synchronized的区别是什么呢#xff1f;join指的是等待一个线程的结束#xff0c;这个线程才结束#xff0c;也就是假如我在main线程中使用了t1.join代表的是main线程得等到t1线程结束了他才能结束他和join和synchronized的区别是什么呢join指的是等待一个线程的结束这个线程才结束也就是假如我在main线程中使用了t1.join代表的是main线程得等到t1线程结束了他才能结束synchronized呢是代表锁的意思意思是当两个线程使用同一个对象来进行锁时他们二者之间只能有一个线程使用这个锁来一个线程必须堵塞等待这个使用锁的线程结束才有机会使用这个“钥匙”。wait和notify呢他代表的是我在某个锁里边使用wait时运行到wait这个关键字这个锁就会在wait关键字这进行堵塞等待堵塞等待的过程中就会把wait所在的锁释放出去供给其他锁使用直到有线程运行到notify关键字才会通知wait关键字可以使用了但通知归通知wait想要再次获得锁必须得“竞争”。wait和notif有什么作用呢举个很简单了例子把每一个线程当成鸟宝宝CPU当成鸟妈妈鸟宝宝会竞争鸟妈妈带回来的虫子资源吃当一个一个线程一直迟到虫子其他虫子就会饿死这是我们就要使用wait和notify了这两个关键字可以让吃过虫子的鸟宝宝等待通知才去竞争虫子把资源让给其他鸟宝宝而这里的饿死也是计算机中的“饿死”wait我们先聊聊waitpublic class Dome15 { public static void main(String[] args) throws InterruptedException { Object object new Object(); Thread t1 new Thread(()-{ System.out.println(你好t1); try { object.wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } }); t1.start(); t1.join(); } }当我们直接使用wait时Java会报错为什么呢我们想想我们使用wait是为了什么不就是为了把锁的资源让给其他线程使用吗这里不加锁那使用wait有什么意义呢故而在使用wait前得先加锁才能使用public class Dome15 { public static void main(String[] args) throws InterruptedException { Object object new Object(); Thread t1 new Thread(()-{ System.out.println(你好t1); try { synchronized(object){ object.wait(); } } catch (InterruptedException e) { throw new RuntimeException(e); } }); t1.start(); t1.join(); } }当我们加完锁之后就会发现这个线程能正常的运行了但他一直在堵塞等待这是就需要用到notify关键字来通知他了这个wait关键字的意思呢是当进入synchronized关键字加锁遇到wait关键字解锁等待遇到notify关键字通知他可以竞争“钥匙”l竞争到钥匙又会加锁遇到“}”又解锁供其他线程使用但我们有一点需要注意的是wait是Object的一个方法所有所有类都继承了wait关键字我们在使用wait关键字时必须得让锁的对象和他一至为什么要一至呢这就得考虑到wait的意义了他的期望就是把锁释放出去给其他人使用而他释放的是嵌套他的锁如果不一致那他释放锁的意义是什么。notify前面我们聊到notify的主要作用是为了通知wait可以去竞争锁了我们写一段代码来感受感受notify的作用public class Dome15 { public static void main(String[] args) throws InterruptedException { Object object new Object(); Thread t1 new Thread(()-{ try { synchronized(object){ System.out.println(开启t1); object.wait(); System.out.println(结束。t1); } } catch (InterruptedException e) { throw new RuntimeException(e); } }); Thread t2 new Thread(()-{ try { Thread.sleep(1); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (object){ Scanner sc new Scanner(System.in); System.out.println(输入任意数唤醒t1:); sc.next(); object.notify(); } }); t1.start(); t2.start(); t1.join(); t2.join(); } }notify的作用呢就是通知wait可以竞争锁了这里我们需要注意的是notify和wait连个关键字的引用必须满足是同一个对象而synchronized之间又必须是同一个对象使用他们四个必须是同一个对象间的引用。此时有一个问题如果有多个wait时notify会怎么办呢public class Dome15 { public static void main(String[] args) throws InterruptedException { Object object new Object(); Thread t1 new Thread(()-{ try { synchronized(object){ System.out.println(开启t1); object.wait(); System.out.println(结束。t1); } } catch (InterruptedException e) { throw new RuntimeException(e); } }); Thread t3 new Thread(()-{ try { synchronized(object){ System.out.println(开启t3); object.wait(); System.out.println(结束。t3); } } catch (InterruptedException e) { throw new RuntimeException(e); } }); Thread t2 new Thread(()-{ try { Thread.sleep(1); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (object){ Scanner sc new Scanner(System.in); System.out.println(输入任意数唤醒t1:); sc.next(); object.notify(); } }); t1.start(); t3.start(); t2.start(); t1.join(); t3.join(); t2.join(); } }此时他就会随机通知一个wait但Java中哟有一个notifyAll可以通知所有wait但不常用故而就不讨论了。再谈wait我们知道join有个特别重要的功能就是可以设计等待的时间毕竟很多计算机都是度秒如年那wait中有没有呢答案是有的。wait也是和join一样若等待时间超过规定的时间就会去竞争锁。此时我们会发现一个现象wait如果加了等待时间会和sleep非常相像但wait可以被提前唤醒sleep只能通过Interrupt来唤醒但Interrput的主要功能并不是用来唤醒的故而sleep在开发中斌不常用。