繁体   English   中英

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

[英]Can't stop a thread during running but debugging

我试图实现一个自动滚动进度条。 问题是,一旦启动我就无法停止它。 但是,在逐步调试过程中,并且仅在调试过程中,它可以正常工作。

这是我的代码片段。 任何帮助将不胜感激。

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;
}
}

这里有很多问题:

  1. 您正在通过不在EDT线程上进行Swing GUI更新。

  2. 您的isvisible变量不是可变的,因此从一个线程进行的更改可能不会从另一个线程看到。

  3. 虽然(true)在线程中睡眠通常是错误的设计。

您应该在此处使用带有时间表的SwingTimer来回调每个X进行更新。 当您需要停止更新时,只需取消SwingTimer并隐藏控件即可。 尽管也需要从EDT中进行隐藏,所以您可能需要执行SwingUtilities.invokeLater

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

据我所知可见性变应至少volatile其他线程能够发现它已经改变了。 您不执行任何同步操作,因此不会更新该值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM