1

我的项目在 java swing 上运行,有 2 个按钮(开始/停止)用于计数。

当我单击开始按钮时。有一个线程正在运行(Thread-0),然后单击停止按钮“Thread-0”消失但是当我多次单击开始按钮时。有许多线程,例如 Thread-5、Thread-6、.. Thread-10 正在运行。

问题: 如果单击开始然后停止计数是可以的。但点击开始多次它是不正确的计数。

开始按钮

private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {         
    start();
    btnStart.setEnabled(false);
    btnStop.setEnabled(true);
}   

停止按钮

private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {            
    isEnable = false;
    btnStop.setEnabled(false);
    btnStart.setEnabled(true);
}    

开始()方法:

isEnable = true;
Thread refreshPlan = new Thread() {  
    @Override
    public void run() {
        while(isEnable) {
            try {
                sleep(CYCLE_TIME * 1000);
                PLAN += 1;
                planValue.setText(String.valueOf(PLAN));
            } catch (InterruptedException ex) {
                //ignore
            }
        }
    };
    };
    refreshPlan.start();

在开始按钮中单击多次时我可以只运行单个线程吗?有什么建议吗?谢谢。

对不起,我的英语不好。

4

2 回答 2

5

这里有四个重大问题:

  • 除非isEnable声明为 volatile 变量,否则不能保证来自一个线程的写入将在另一个线程中看到
  • 同样,您对PLAN计数器的访问(命名错误 - 请遵循 Java 命名约定)是不安全的。您不妨考虑使用AtomicInteger它。
  • 您正在从额外的线程对 UI 进行更改。你不能这样做——在 Swing(和大多数 UI)中,对 UI 组件的所有访问都必须在负责该 UI 的线程上完成。有关更多详细信息,请参阅Swing 并发教程
  • 因为您isEnabled每秒只检查一个,所以可以同时停止和启动多个线程......导致多个线程同时处于活动状态。这可能会干扰您的计数。

您可能会发现最好使用 a javax.swing.Timerwhich 每秒触发一次,然后检查它是否打算做任何事情。这样,一切都可以在 UI 线程上。

于 2013-03-15T06:58:12.210 回答
-1

start 方法正在实例化 new Thread() 这就是为什么每次您单击它时,它都会将新线程带入生活。

声明Thread refreshPlan类变量,然后在 start 方法中将所有代码放入此检查中

if(refreshPlan == null || !refreshPlan.isAlive()){
//ur existing code to instantiate new thread.
}
于 2013-03-15T06:58:02.517 回答