java线程在运行多个线程时不会中断

时间:2013-03-15 06:46:01

标签: java multithreading swing

我的项目在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);
}    

start()方法:

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();

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

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:5)

这里有四个重要问题:

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

您可能会发现最好使用每秒触发一次的javax.swing.Timer,并检查它是否意味着做任何事情。那样所有都可以在UI线程上。

答案 1 :(得分:-1)

start方法是实例化新的Thread(),这就是为什么每次你点击它,它都会带来新的线程。

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

if(refreshPlan == null || !refreshPlan.isAlive()){
//ur existing code to instantiate new thread.
}