【问题标题】:Can't stop a thread during running but debugging在运行但调试期间无法停止线程
【发布时间】:2014-02-07 07:13:20
【问题描述】:

我尝试实现一个自动滚动进度条。问题是一旦它开始我就无法阻止它。但它在逐步调试期间工作正常,并且仅在调试期间工作。

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

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

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCTaRE(经过测试和可读的最小完整示例)。
  • 注意:GUI 更新应该在 EDT 上执行,而我们不应该让 EDT 休眠。有关详细信息,请参阅Concurrency in Swing
  • 你是如何阻止它的?
  • @TimB 我试图通过更改变量 isvisible 来阻止它。
  • @AndrewThompson 谢谢你的提示。我刚刚发布了一个不完整的片段,因为实际上我的 MCTaRE 在运行期间没有这样的问题。

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


【解决方案1】:

这里有一大堆问题:

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

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

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

您应该在此处使用SwingTimer 并安排每个 X 回调以进行更新。当您需要停止更新时,只需取消 SwingTimer 并隐藏控件即可。隐藏也需要从 EDT 完成,因此您可能需要执行 SwingUtilities.invokeLater

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多