在运行期间无法停止线程但是调试

时间:2014-02-07 07:13:20

标签: java multithreading swing event-dispatch-thread thread-sleep

我尝试实现自动滚动进度条。问题是我无法阻止它开始。但是在逐步调试期间,只有在调试期间才能正常工作。

这是我的代码片段。任何帮助将受到高度赞赏。

package test;

import javax.swing.*;

public final class MyTest{
private boolean isvisible = false;
private JProgressBar progressbar = new JProgressBar();
/**
 * thread of automatic rolling progress-bar
 */
private Thread proT = new Thread(new Runnable(){
    @Override
    public void run(){
    isvisible = true;
    progressbar.setVisible(true);
    while(true){
        progressBar.setValue((progressBar.getValue() + 20)%100);
        System.out.println(progressBar.getValue()); 
        try{
        Thread.sleep(500);
        }catch(InterruptedException e){
        e.printStackTrace();
        }
        if(!isvisible){
        progressbar.setVisible(false);
        break;
        }
    }
    }
});
/**
 * constructor
 */
public MyTest(){
    //initiate GUI
}
/**
 * show an automatic rolling progress-bar
 */
public void showProgressBar(){
    proT.start();
}

/**
 * stop/veil the progress-bar
 */
public void veilProgressBar(){
    isvisible = false;
}
}

2 个答案:

答案 0 :(得分:3)

这里有一大堆问题:

  1. 您正在从不在EDT主题上进行Swing GUI更新。

  2. 您的isvisible变量不易变,因此可能无法从另一个线程看到从一个线程所做的更改。

  3. 虽然(真的)在线程中睡眠通常是糟糕的设计。

  4. 你应该在这里使用SwingTimer和一个时间表来回调每个X来进行更新。当您需要停止更新时,只需取消SwingTimer并隐藏控件即可。隐藏也需要从EDT完成,因此您可能需要SwingUtilities.invokeLater

    可能还有更多,但这是我到目前为止看到的。

答案 1 :(得分:0)

AFAIK isvisible变量应至少为volatile,以便其他线程能够注意到它已被更改。您不进行任何同步,因此值不会更新。