关于多线程代码的执行结果

飞火流云 2013-06-04 10:06:35
public class ThreadPriority {

public static void main(String[] args) {
Producer p = new Producer();
p.start();

for (int i = 1; i < 5; i++) {
Consumer cr = new Consumer();
cr.setPriority(i);
cr.start();
}

}

}

class Consumer extends Thread {
public Consumer()
{
setDaemon(true);
}
public void run() {
try {
synchronized (Producer.slotNum) {
if (Producer.slotNum == 0)
Producer.slotNum.wait();
Producer.slotNum--;
System.out.println(" Thread " + this.getId() + " consumer 1!");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

class Producer extends Thread {

public static Integer slotNum = 10;

public Producer()
{
setDaemon(true);
}

public void run() {
synchronized (slotNum) {
slotNum++;
slotNum.notifyAll();
System.out.println(" Thread " + this.getId() + " producer 1!");
}
}

}

报错:Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
Thread 10 consumer 1!
at java.lang.Object.notifyAll(Native Method)
at future.Producer.run(ThreadPriority.java:51)
Thread 13 consumer 1!
Thread 11 consumer 1!
Thread 12 consumer 1!

搜了下,网上说: notifyAll()的描述,“解除那些在该对象上调用wait()方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是对象所得持有者,该方法抛出一个java.lang.IllegalMonitorStateException 异常”

这里Producer 应该是slotNum 对象的持有者吧,而且notifyall和wait都是在同步块内调用的,为什么还会报出这样一个异常呢?

此外写这个代码的目的就是测试下,当一群线程在wait一个对象时, notifyAll()方法唤醒线程是按照优先级的顺序呢? 还是其他?在网上搜的有两种说法,一种是按优先级,一种是说没有明确的顺序。
当然,只要是人写的程序,总是会有一定规律的吧。
...全文
315 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶飞舟 2013-06-07
  • 打赏
  • 举报
回复
只要没设置每个线程的优先级,那么notifyAll的时候,它们会竞争对象上的锁(synchronize),先得先行,其它的只能排队等候!
gu390154333 2013-06-07
  • 打赏
  • 举报
回复
关于错误,Integer或者String、Boolean等类型,一旦有赋值操作之后,在调用该对象的notifyAll()方法后,将视为新对象,导致试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。若还想想用你代码将Integer换成AtomicInteger即可。 还有生产、消费者模式不是你这么写的。 线程的优先级这个东西根本就不能指望,不同操作系统差别很大,或则无效,一定希望线程按严格顺序执行执行,用阻塞队列吧,设置公平参数,保证等待时间最长的线程有限执行。
wenwu139 2013-06-06
  • 打赏
  • 举报
回复
notifyAll()是唤醒所有的线程也包括自己,然后系统会按照线程的优先级去执行 唤醒是没有优先级的 执行才有优先级

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧