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

飞火流云 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()方法唤醒线程是按照优先级的顺序呢? 还是其他?在网上搜的有两种说法,一种是按优先级,一种是说没有明确的顺序。
当然,只要是人写的程序,总是会有一定规律的吧。
...全文
356 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶飞舟 2013-06-07
  • 打赏
  • 举报
回复
只要没设置每个线程的优先级,那么notifyAll的时候,它们会竞争对象上的锁(synchronize),先得先行,其它的只能排队等候!
gu390154333 2013-06-07
  • 打赏
  • 举报
回复
关于错误,Integer或者String、Boolean等类型,一旦有赋值操作之后,在调用该对象的notifyAll()方法后,将视为新对象,导致试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。若还想想用你代码将Integer换成AtomicInteger即可。 还有生产、消费者模式不是你这么写的。 线程的优先级这个东西根本就不能指望,不同操作系统差别很大,或则无效,一定希望线程按严格顺序执行执行,用阻塞队列吧,设置公平参数,保证等待时间最长的线程有限执行。
wenwu139 2013-06-06
  • 打赏
  • 举报
回复
notifyAll()是唤醒所有的线程也包括自己,然后系统会按照线程的优先级去执行 唤醒是没有优先级的 执行才有优先级
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 全国计算机等级考试二级教程《Python语言程序设计》(2018年版)被视为针对Python入门者和备考人员的核心学习材料。该资料汇总了教材内的所有编程练习答案,这些答案在Python 3.5.3环境中经过实际执行测试,从而保障了代码的准确性和应用价值。备考人员借助这些答案,能够评估自身的学习进度,并深入理解和熟练掌握Python编程的基础原理与方法。 1. Python基础理论:Python作为一门高级编程语言,因其简明扼要的语法结构和卓越的功能表现而备受推崇。基础内容涵盖了变量、数据种类(例如整型、浮点型、字符串、布尔型、列表、元组、字典、集合)、逻辑控制(比如条件判断if-else,循环控制for、while)、函数的声明及使用、模块的引入等。 2. Python高级应用:Python的进阶内容涉及异常管理(try-except-finally结构),类与实例(面向对象编程的基础,包含类的构造、对象的生成、属性与方法的运用、继承机制、多态表现),装饰器(用于调整函数或类的功能特性),上下文管理器(借助with语句实现资源管理)等。 3. 数据文件处理:Python配备了全面的文件操作功能,涉及文件的开启、数据读写、关闭操作,以及多种操作模式(例如r模式用于读取,w模式用于写入,a模式用于追加内容等)。此外,还包括文本文件与二进制文件的转换处理,以及文件的位置调整、复制和删除等操作。 4. 标准库的运用:Python的标准库资源极为丰富,比如os模块提供操作系统接口,sys模块用于获取系统参数,random模块可用于生成随机数值,datetime模块负责处...

25,979

社区成员

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

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