gpt4 book ai didi

java - 如何使用Java Swing手动控制哪个线程进入临界区?

转载 作者:行者123 更新时间:2023-12-02 06:20:03 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的基于 Java Swing 的应用程序,该应用程序手动控制两个线程,这两个线程都试图不断增加整数值。应用程序应该能够“启动”“停止”任一线程(两个线程同时递增值)并将任一线程放入关键区域(仅允许一个线程递增值)。

这是我所拥有的屏幕截图,以便您可以更好地理解我的目标:

/image/yKhS9.png

我创建了一个“Incrementor”类,它负责递增 int 值,但是如果我尝试将同步关键字添加到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();
}
}
}

关于如何进行的任何建议?

我希望我已经清楚地说明了我在寻找什么,如果没有,请告诉我,我会更新这篇文章。

最佳答案

你的问题是可怕的线程锁!!

but if I try adding the synchronized keyword to the increment() method, I do not get the result I want.

当然!线程管理器会在需要时更改“工作”线程!,您应该在此处发布更多代码,但从第一眼看来,您在两个线程中运行相同的方法,因此它将下降到 2 种情况:-

  1. 好案例!线程管理器在完成调用增量方法后更改线程(两个线程都赢了^-^)。
  2. 糟糕的情况(这就是你所面临的)想象一下,一个线程访问了该方法,在完成该方法之前,线程管理器更改了该方法,当另一个方法尝试访问该方法时,发现它与另一个线程中的锁同步了一个大的令人讨厌的synchronized!他们不能保证会发生什么,但我可以向您保证,90% 的情况结果只会让线程管理器满意。

The application should be able to 'Start' and 'Stop' either of the threads (both threads incrementing the value simultaneously) and put either of the threads in the critical region (only one thread allowed to increment value).

很抱歉打扰您,但线程管理器是无法控制的,我的 friend 。但我们可以向线程管理器建议相当多的事情,因此您尝试实现的目标在 java 线程管理器中是不可能的。

停止线程很奇怪,但是在停止线程后启动线程是很不!!!

来自Thread.start()文档

It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.

throws IllegalThreadStateException if the thread was already started.

这里有一个非常丰富的链接,您可以更广泛地解释该主题 at the oracle's

关于java - 如何使用Java Swing手动控制哪个线程进入临界区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55841778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com