您现在的位置是:主页 > news > 网站建设公司招商/百度网盘服务电话6988

网站建设公司招商/百度网盘服务电话6988

admin2025/6/8 16:53:38news

简介网站建设公司招商,百度网盘服务电话6988,商城网站建设经验,自己做网站怎么上传近期在学习Java的多线程机制,看到视频上的老师写了一个做吃包子的案例,当自已写时一直得不到自已想要的结果, 甚至怀疑老师用的是 jdk9 我有的是jdk11 ,最终发现是自已的代码流程上的问题,下面是问题代码 package com…

网站建设公司招商,百度网盘服务电话6988,商城网站建设经验,自己做网站怎么上传近期在学习Java的多线程机制,看到视频上的老师写了一个做吃包子的案例,当自已写时一直得不到自已想要的结果, 甚至怀疑老师用的是 jdk9 我有的是jdk11 ,最终发现是自已的代码流程上的问题,下面是问题代码 package com…

近期在学习Java的多线程机制,看到视频上的老师写了一个做吃包子的案例,当自已写时一直得不到自已想要的结果, 甚至怀疑老师用的是 jdk9 我有的是jdk11 ,最终发现是自已的代码流程上的问题,下面是问题代码

package com.huang.thread3;
public class Baozi {public static void main(String[] args) {System.out.println("包子店营业了");Object o = new Object();//买包子线程new Thread(){@Overridepublic void run() {while(true){System.out.println("客人线程:老板我要一笼包子");System.out.println("客人线程:你手工现做吧,我在座位上等一会儿");synchronized (o){try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("客人线程:很好,我开吃了");}}}.start();//做包子线程new Thread(){@Overridepublic void run() {System.out.println("老板线程:客人等我5秒钟,做好了我叫你");while(true){synchronized (o){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("老板线程:客人你好,你要的包子做好了");o.notify();}}}}.start();}
}

上面的代码执行结果就是 一直是老板的线程单方面输出,看了老半天, 最后才发现, 因为老板线程中的 while(true) 所以 老板线程一直占用着线程锁,即使这个线程处于 sleep的状态, 它是仍然是占用着线程锁的 当sleep() 时间结束之后, 又进入下一个循环, 又把锁给占用了, 所以 客人线程是根本没有机会抢到线程锁的, 所以,要把 Thread.sleep的代码放在 同步代码块的外面, 就可以让 老板线程让出线程锁了, 客人线程就会执行了
更改后的代码如下, 客人线程不变, 下面是老板线程的修改

 //做包子线程new Thread(){@Overridepublic void run() {System.out.println("老板线程:客人等我5秒钟,做好了我叫你");while(true){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o){System.out.println("老板线程:客人你好,你要的包子做好了");o.notify();}}}}.start();

我们把Thread.sleep() 移出 synchronized() 代码块,就得到了想要的结果