java - java - 如何使用Java Swing手动控制哪个线程进入临界区?
问题描述
我正在尝试创建一个简单的基于 Java Swing 的应用程序,该应用程序手动控制两个线程,这两个线程都试图不断增加一个整数值。应用程序应该能够“启动”和“停止”任一线程(两个线程同时递增值)并将任一线程置于临界区(仅允许一个线程递增值)。
这是我所拥有的屏幕截图,以便您更好地理解我的目标:
https://i.imgur.com/sQueUD7.png
我创建了一个“Incrementor”类来完成递增 int 值的工作,但是如果我尝试将 synchronized 关键字添加到 increment() 方法,我不会得到我想要的结果。
private void increment() {
while (Thread.currentThread().isAlive()) {
if (Thread.currentThread().getName().equals("Thread 1")) {
if (t1Stop.isEnabled()) {
value++;
t1TextField.setText("Thread 1 has incremented value by 1. Current value = " + value + "\n");
}
} else if (Thread.currentThread().getName().equals("Thread 2")) {
if (t2Stop.isEnabled()) {
value++;
t2TextField.setText("Thread 2 has incremented value by 1. Current value = " + value + "\n");
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
关于如何进行的任何建议?
我希望我已经明确了我在寻找什么,如果没有,请告诉我,我会更新这篇文章。
解决方案
你的问题是可怕的线程锁!
但是如果我尝试将 synchronized 关键字添加到 increment() 方法,我不会得到我想要的结果。
当然 !线程管理器随时更改“工作”线程!,您应该在此处发布更多代码,但乍一看,您在两个线程中运行相同的方法,因此它将下降到 2 种情况:-
- 好案例!线程管理器在完成调用增量方法后更改线程(两个线程的好老双赢^-^)。
- 糟糕的情况(这就是您所面临的)想象一个线程访问了该方法,并且在完成该方法之前,线程管理器更改了它,并且当另一个方法尝试访问它时,发现
synchronized
它面临着锁其他线程!从这里他们不能保证会发生什么,但我可以向你保证,这种情况下 90% 的结果只会让线程管理器满意。
应用程序应该能够“启动”和“停止”任一线程(两个线程同时递增值)并将任一线程置于临界区(仅允许一个线程递增值)。
很抱歉打扰您,但线程管理器是无法控制的,我的朋友。但是我们可以向线程管理器提出相当多的建议,因此您尝试实现的目标在 java 线程管理器中是不可能的。
并停止线程的 ooky dooky ,但是在停止线程后启动线程是大不!
从Thread.start()
文档
多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。
如果线程已经启动,则抛出 IllegalThreadStateException。
这是一个非常丰富的链接,您可以在 oracle 上更广泛地解释该主题
推荐阅读
- javascript - 在从 fetch 查询(GeoJSON 响应)中检索到的点上放置一个弹出窗口
- python - Django REST Framework 序列化程序验证错误
- java - itext7 pdfhtml 2.0.2 没有背景和边框
- gwt - GWT CellTable 标头和正文的不同 ContextMenus
- submitchanges - oData Model submitChanges 错误回调函数未执行
- c++ - 如何在 Visual Studio 中使用 _controlfp_s 禁用所有异常
- python - 如何在一个窗口中包含多个图表
- python - scipy.minimize 似乎不遵守约束
- dart - 如何使用 fcm 在 Flutter 中的推送通知中添加图像?
- php - 如何在mysql数据库中存储0.5