目前我有两个SwingWorker线程在后台工作.如果发生异常,该方法将停止工作,但该线程仍然运行.
如何停止执行并杀死doInBackground()发生异常的线程?
this.cancel(true)不要破坏/关闭线程.我怎样才能做到这一点?
@Override
protected Boolean doInBackground() throws Exception {
try {
while (true) {
//some code here
return true;
}
} catch (Exception e) {
this.cancel(true); //<-- this not cancel the thread
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Netbeans的调试中看到了这些线程.
'AWT-EventQueue-0' em execução
'AWT-Windows' em execução
'SwingWorker-pool-1-thread-1' em execução
'SwingWorker-pool-1-thread-2' em execução
//*em execução = in execution
Run Code Online (Sandbox Code Playgroud) 我有这个数据流,粗略地说:
DataGenerator -> DataFormatter -> UI
Run Code Online (Sandbox Code Playgroud)
DataGenerator可以快速生成数据; DataFormatter可以将其格式化以用于显示目的; UI只是一堆Swing元素.
我想让我的DataGenerator像这样:
class DataGenerator
{
final private PropertyChangeSupport pcs;
...
public void addPropertyChangeListener(PropertyChangeListener pcl) {
this.pcs.addPropertyChangeListener(pcl);
}
public void removePropertyChangeListener(PropertyChangeListener pcl) {
this.pcs.removePropertyChangeListener(pcl);
}
}
Run Code Online (Sandbox Code Playgroud)
this.pcs.firePropertyChange(...)只要我的数据生成器有新数据就调用; 然后,我可以做dataGenerator.addPropertyListener(listener)在那里listener负责推动变化着的DataFormatter,然后到用户界面.
这种方法的问题在于,每秒有数千个dataGenerator更改(根据我的情况,每秒10,000到60,000之间),并且为UI格式化它的计算成本足够高,它会给我带来不必要的负担中央处理器; 我真正关心的是每秒最多10-20次变化.
有没有办法使用类似的方法,但在变更事件到达DataFormatter之前合并它们?如果我收到关于单个主题的多个更新事件,我只关心显示最新的事件,并且可以跳过所有以前的事件.
我希望在按下按钮时继续执行工作,使用Java.释放按钮后,工作应该停止.像这样的东西:
Button_is_pressed()
{
for(int i=0;i<100;i++)
{
count=i;
print "count"
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能实现这个目标?
java ×3
swing ×2
buttonclick ×1
cancellation ×1
event-queue ×1
jbutton ×1
onclick ×1
swingworker ×1