[英]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;
}
}
這里有很多問題:
您正在通過不在EDT線程上進行Swing GUI更新。
您的isvisible變量不是可變的,因此從一個線程進行的更改可能不會從另一個線程看到。
雖然(true)在線程中睡眠通常是錯誤的設計。
您應該在此處使用帶有時間表的SwingTimer
來回調每個X進行更新。 當您需要停止更新時,只需取消SwingTimer
並隱藏控件即可。 盡管也需要從EDT中進行隱藏,所以您可能需要執行SwingUtilities.invokeLater
。
可能還有更多,但這是我到目前為止所看到的。
據我所知可見性變應至少volatile
其他線程能夠發現它已經改變了。 您不執行任何同步操作,因此不會更新該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.