Java Can';不要在运行期间停止线程,但要进行调试
我试图实现一个自动滚动进度条。问题是我不能一开始就阻止它。但是,在逐步调试期间,并且仅在调试期间,它可以正常工作 这是我的代码片段。我们将非常感谢您的帮助Java Can';不要在运行期间停止线程,但要进行调试,java,multithreading,swing,event-dispatch-thread,thread-sleep,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
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;
}
}
AFAIK isvisible变量应至少为
volatile
,以便其他线程能够注意到它已被更改。您不执行任何同步操作,因此不会更新该值。AFAIK isvisible变量应至少为volatile
,以便其他线程能够注意到它已被更改。您不执行任何同步操作,因此不会更新该值。AFAIK isvisible变量应至少为volatile
,以便其他线程能够注意到它已被更改。您不执行任何同步操作,因此不会更新该值。AFAIK isvisible变量应至少为volatile
,以便其他线程能够注意到它已被更改。您不进行任何同步,因此不会更新值。这里有一大堆问题:
SwingTimer
,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消SwingTimer
并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行SwingUtilities.invokeLater
可能还有更多的问题,但这是我迄今为止看到的。这里有一大堆问题:
SwingTimer
,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消SwingTimer
并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行SwingUtilities.invokeLater
可能还有更多的问题,但这是我迄今为止看到的。这里有一大堆问题:
SwingTimer
,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消SwingTimer
并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行SwingUtilities.invokeLater
可能还有更多的问题,但这是我迄今为止看到的。这里有一大堆问题:
SwingTimer
,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消SwingTimer
并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行SwingUtilities.invokeLater
可能还有更多,但这是我到目前为止所看到的。要更快获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个未完成的片段,因为实际上我的MCTaRE在运行时没有这样的问题。为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个未完成的片段,因为实际上我的MCTaRE在运行时没有这样的问题。为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个未完成的片段,因为实际上我的MCTaRE在运行时没有这样的问题。为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个不完整的片段,因为实际上我的MCTaRE在跑步时没有这样的问题。