- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了生产者和消费者的示例,并且做了一些改动。 Pro()将打印“第一”,而con()将打印“第二”。我希望每个“第二”出现在“第一”之后。
public class test {
test() { }
synchronized void pro() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("First!");
notify();
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
synchronized void con() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Second!");
notify();
}
}
}).start();
}
public static void main(String[] args) {
test m = new test();
m.pro();
m.con();
}
}
First!
Exception in thread "Thread-0" Exception in thread "Thread-1"
java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at test$1.run(test.java:12)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:503)
at test$2.run(test.java:32)
at java.lang.Thread.run(Unknown Source)
最佳答案
这里同时发生了几个问题。
首先是显而易见的IllegalMonitorStateException
。当调用线程不持有对象的监视器锁定时,在对象上调用wait
或notify
时,将发生此异常。即使调用在语法上在synchronized
方法内发生,但对wait
和notify
的实际调用在不同的线程上发生并且在不同的对象上运行。
发生的事情是您的pro
和con
方法在实例上同步。由于它们是通过main
方法调用的,因此主线程是获取监视器锁的线程。但是这些方法只是启动其他线程,然后释放锁。wait
和notify
调用是隐式的this.wait
和this.notify
,它们在Runnable
匿名内部类之内,因此,在这些情况下,this
引用的是Runnable
实例,而不是已同步的外部test
实例。规则是,在对象上调用wait
(或notify
)的同一线程也必须在该对象上拥有监视器锁定。由于不是这种情况,因此会抛出IllegalMonitorStateException
。另一个问题是wait
和notify
调用位于不同的 Runnable
实例上。不同的线程必须在同一对象上使用wait/notify进行通信。
您需要做的是重新排列代码,以便synchronized
块出现在执行实际同步的线程中。然后,您要确保synchronized
,wait
和notify
操作都在同一对象上。也许最好的方法是将test
实例存储在静态字段中(例如,使m
为静态字段而不是局部变量)。 run
方法是Runnable
实例的成员,因此您不能仅使这些方法同步。相反,您必须使用synchronized
块并传递要在其上进行同步的实例。您也可以从synchronized
和pro
方法中删除con
关键字,因为这些方法实际上不需要同步。结果代码如下所示:
static test m = new test();
void pro() {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (m) {
...
m.notify();
...
m.wait();
...
}
}
}).start();
}
con
方法的操作。
IllegalMonitorStateException
的情况下运行。但这揭示了第二个问题:它可能不起作用。由于丢失的唤醒问题,它可能会死锁。完整的解释超出了此答案的范围。简要地说,如果首先运行由
pro
启动的线程,则在没有线程等待时,它可能会调用
notify
。如果发生这种情况,则什么也不会发生。然后,该线程继续并调用
wait
。接下来,
con
线程可能会启动,并且它首先要做的是调用
wait
。现在,两个线程都被阻止在
wait
中,并且永远不会出现
notify
。
wait
无效,在不更改对象状态的情况下调用notify
也无效。wait
和notify
的完整说明,请参阅Goetz,《 Java并发实践》第14章。
关于multithreading - IllegalMonitorStateException调用wait()和notify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23976599/
我有2个功能: function func1() while true do -- listen on connection end end function func2()
我的问题可能看起来很奇怪,但我想我正面临着 volatile 的问题。对象。 我写了一个这样实现的库(只是一个方案,不是真正的内容): (def var1 (volatile! nil)) (def
由于 maven 支持多线程构建,是否可以同时运行 Sonar 多线程? (例如 mvn sonar:sonar -T 4 ) 我运行了它,当模块报告成功时,它报告整个构建失败并返回 java.uti
我们正在启动一个网站,该网站在短时间内的交易量非常大。它基本上是在给票。该代码是用Java,Spring和Hibernate编写的。我想通过产生多个线程并尝试使用JUnit测试用例来获取票证来模仿高容
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用RenderTarget-> ReadPixels(),但是由于ReadPixels()的 native
我们有以下系统: 用户数:〜500k 项目数:〜100k UserSimilarity userSimilarity = new TanimotoCoefficientSimilarity(dataM
也许这是一个经常出现的问题,但我需要根据我的上下文进行一些自定义。 我正在使用 Spring Batch 3.0.1.RELEASE 我有一个简单的工作,有一些步骤。一个步骤是这样的 block :
也许这是一个经常出现的问题,但我需要根据我的上下文进行一些自定义。 我正在使用 Spring Batch 3.0.1.RELEASE 我有一个简单的工作,有一些步骤。一个步骤是这样的 block :
我正在尝试使用PyBrain和Python的multiprocessing软件包在Python中训练神经网络。 这是我的代码(它训练了一个简单的神经网络来学习XOR逻辑)。 import pybrai
我有一个繁重的功能,不适合在主时间轴上执行(因为要花很长时间才能完成并使程序崩溃)。 因此我在air(as3)中搜索多线程,但是我发现的所有示例都说明了如何在worker中运行单独的swf文件。如何在
我想实现线程A 和线程B 并行运行并共享全局变量。 下面是用python编写的代码。我想在中执行相同操作Dart (我不想使用future等待,因为它正在等待其他线程完成或必须等待。) 大小写变量:
我的一个项目只适用于调试 DLL,而不适用于非调试 DLL。 在 Debug DLL 设置下发布项目有哪些注意事项?例如,是否丢失了某些优化? 如何通过将调试版本设置为非调试 DLL 来调试此项目?我
我正在尝试比较 Matlab 和 Julia 之间的速度和性能。我正在查看一个代码,该代码对承受给定负载的连续体结构进行拓扑优化。我正在查看的代码是公共(public)代码topopt88.m:htt
Serving Flask 应用程序“服务器”(延迟加载) 环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产 WSGI 服务器。 Debug模式:开启 在 http://0.0.
我对 PyQT 很陌生。我正在学习如何制作 Progressbar 并随着算法的进展对其进行更新。我已经能够制作一个使用此链接进行 self 更新的基本进度条:Python pyqt pulsing
我正在尝试指定在特定线程上运行任务,这样我就可以使用两个专用于“放入” channel 的耗时任务的线程,而其他线程则用于处理该任务。 我对如何将特定任务分配给特定线程感到困惑。我以为我可以使用类似
我正在编写一个软件,它对很多(潜在的大)图像进行大量图像操作/合成。 多线程有助于提高速度,但 QT 不允许同时在同一图像上使用多个 QPainter。 所以我必须在副本的每个线程中进行图像操作/合成
此脚本读取 url 文件以执行多线程 HTTP 请求。 如何使用带有 url 的数组来发出多线程请求? 我的阵列将有类似的东西: @array = ("https://example.com/xsd"
Java 文档声明了以下关于构造函数同步的内容: Note that constructors cannot be synchronized — using the synchronized keyw
我有一个程序,其中主线程创建了很多线程。它崩溃了,我正在调试核心文件。崩溃发生在其中一个子线程中。为了找到原因,我需要知道主线程是否还活着。有什么方法可以找出哪个线程是初始线程? 最佳答案 Is th
我是一名优秀的程序员,十分优秀!