在Swing响应中保持按钮和其他组件的最佳方法是什么。我总是使用" new Thread(){public void run(){}}。start();"在每个动作听众身上,但我不知道如何在不使用" Thread.stop()"的情况下停止或取消该主题。任何建议或提示?
答案 0 :(得分:1)
我的经验法则只是SwingWorker
,如果它是非常长时间运行的任务。通过长时间运行,我的意思几乎与应用程序的生命相同。因此,我几乎从不开始自己的线程。
为每个小操作启动一个线程是一个坏主意,因为Threads旋转起来很昂贵。通常的解决方案是使用ThreadPool
重用线程,让您远离您的头痛。
但是随着时间的推移,还有一个final JLabel label;
class MeaningOfLifeFinder extends SwingWorker<String, Object> {
@Override
public String doInBackground() {
return findTheMeaningOfLife();
}
@Override
protected void done() {
try {
label.setText(get());
} catch (Exception ignore) {
}
}
}
SwingWorker<String, Object> worker = new MeaningOfLifeFinder();
worker.execute();
的选项,它将在后台池线程上运行,并为您提供简单的方法来更新您的UI与正确线程中的任何结果。
来自https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html
worker.cancel(false);
请参阅https://docs.oracle.com/javase/tutorial/uiswing/concurrency/cancel.html
取消摇摆工人很容易。 isCancelled()
设置一个标记,您必须通过选中@Override
public String doInBackground() {
//somework
if(isCancelled()) return ...; // check occasionally and return early when cancelled
//somemorework
return ...;
}
来查找该标记。
{{1}}
答案 1 :(得分:0)
一种快速方法是简单地定期检查线程是否应该继续工作。像这样:
public void run(){
doThingOne();
if(cancelled){
return;
}
doThingTwo();
if(cancelled){
return;
}
doThingThree();
}
然后,您只需要在标记为“取消”的按钮中取消线程时设置cancelled
变量。
Google是您的朋友,但请参阅以下相关问题以获取更多信息:
How to stop, pause, cancel a thread in java
Java long running task Thread interrupt vs cancel flag
How do you kill a thread in Java?
How to properly stop the Thread in Java?
Java教程总是一个好看的地方:https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html