为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

大话西游666 2022-10-20 17:15:24
我正在尝试创建一个简单的基于 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();            }        }    }关于如何进行的任何建议?我希望我已经明确了我在寻找什么,如果没有,请告诉我,我会更新这篇文章。
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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

但是如果我尝试将 synchronized 关键字添加到 increment() 方法,我不会得到我想要的结果。

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

  1. 好案例!线程管理器在完成调用增量方法后更改线程(两个线程的好老双赢^-^)。

  2. 糟糕的情况(这就是您所面临的)想象一个线程访问了该方法,并且在完成该方法之前,线程管理器更改了它,并且当另一个方法尝试访问它时,发现synchronized它面临着锁其他线程!从这里他们不能保证会发生什么,但我可以向你保证,这种情况下 90% 的结果只会让线程管理器满意。

应用程序应该能够“启动”和“停止”任一线程(两个线程同时递增值)并将任一线程置于临界区(仅允许一个线程递增值)。

很抱歉打扰您,但线程管理器是无法控制的,我的朋友。但是我们可以向线程管理器建议相当多的事情,所以你想要实现的目标在 java 线程管理器中是不可能的。

并停止线程的 ooky dooky ,但是在停止线程后启动线程是大不!

Thread.start()文档

多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

如果线程已经启动,则抛出 IllegalThreadStateException。

这是一个非常丰富的链接,您可以在 oracle 上更广泛地解释该主题


查看完整回答
反对 回复 2022-10-20
?
SMILET

TA贡献1796条经验 获得超4个赞

synchronized您可以使用关键字来使用对象级锁。


=>对象级锁:To synchronize a non static method or block so that it can be accessed by only one thread at a time for that instance. It is used to protect non static data.


例子 :


public class ClasswithCriticalSections {

    private AtomicInteger count = new AtomicInteger(0);

    public synchronized int increment() {

      count.incrementAndGet();

      return count;

    }

}

或者


public class ClasswithCriticalSections {

    Object lock1 = new Object();

    Object lock2 = new Object(); 

    private AtomicInteger count = new AtomicInteger(0);

    public int increment() {

      synchronized(lock1) {

         count.incrementAndGet();

         return count;

      }

    }

    public int decrement() {

      synchronized(lock2) {

         count.addAndGet(-1);

         return count;

      }

    }

}


查看完整回答
反对 回复 2022-10-20
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号