簡體   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