关于notifyAll()的唤醒顺序和程序执行结果,求教了 本帖最后由 cloudeagle_bupt 于 2013-06-06 17:51:35 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个程序没有错,main方法先它运行5个线程,由于slot.slotNum == 0,均等待,直到 Producer p = new Producer(s); p.start(); 运行synchronized (slot) { while (slot.slotNum == 20) slot.wait(); slot.produce(); slot.notifyAll(); System.out.println("Thread " + this.getName() + " producing ! slotNum is " + slot.slotNum+"\n"); } slot.produce(); 这儿slot.slotNum == 1, slot.notifyAll唤醒所有线程,打印System.out.println("Thread " + this.getName() + " producing ! slotNum is " + slot.slotNum+"\n");该 线程结束,其中thread4抢到资源,线程4运行完slot.slotNum == 0,其他线程继续等待最终原因你只生参了一个产品,消费共有五个线程,一个运行晚还有4个。自然是等待 不建议用优先级。因为有些语言不支持1到10的。notify是随机唤醒的,要想唤醒特定的线程,设置相应的bool值变量。 能举个例子么? 这里我一直不明白的是,如何才能得到当前的唤醒线程呢? 或者说,怎么去判断哪个线程被唤醒了? 我用的办法是设置全局变量,f1到fn,初始为false,想唤醒那个就把对应的f值设为true。然后判断一下好了。貌似也只适合用线程比较少的情况。多个线程应该用线程池比较好。 求Java初学者的一些练习题 仅以此帖献给那些发帖不结贴的人· 数据库操作时出现java.lang.NullPointerException问题 如何求两个ip地址之间的ip数目,求高人指点 20分送 我在eclipse环境下写了一个与sqlserver2000连接的程序,但总是出现错误, 如何调用父类的方法? Java初学者的问题,关于图形编程的 初学Java :关于 switch case 问题 请问如何把jar文件转换为class文件 关于通过浏览器表单同时上传文件及文本内容的问题 关于源文件名和其中的类名 自己尝试编了一个登录界面,但界面显示有问题,求帮看看
Producer p = new Producer(s);
p.start(); 运行
synchronized (slot) { while (slot.slotNum == 20) slot.wait(); slot.produce(); slot.notifyAll(); System.out.println("Thread " + this.getName() + " producing ! slotNum is " + slot.slotNum+"\n"); }
slot.produce(); 这儿slot.slotNum == 1,
slot.notifyAll唤醒所有线程,
打印System.out.println("Thread " + this.getName() + " producing ! slotNum is " + slot.slotNum+"\n");该 线程结束,
其中thread4抢到资源,线程4运行完slot.slotNum == 0,其他线程继续等待
最终原因你只生参了一个产品,消费共有五个线程,一个运行晚还有4个。自然是等待
能举个例子么? 这里我一直不明白的是,如何才能得到当前的唤醒线程呢? 或者说,怎么去判断哪个线程被唤醒了? 我用的办法是设置全局变量,f1到fn,初始为false,想唤醒那个就把对应的f值设为true。然后判断一下好了。貌似也只适合用线程比较少的情况。多个线程应该用线程池比较好。