我有用于多线程的Worker类。
public class Worker extends SwingWorker<Void , String>
{
private int optionOfWork;
public Worker(int int optionOfWork)
{
this.optionOfWork = optionOfWork;
}
...
...
protected Void doInBackground() throws Exception
{
switch (optionOfWork) {
case 1:
{
...
...
break;
}
case 2:
{
...
something...
}
default:
{
...
}
}
}//doInBackground()
}//Worker class
说我创建一个工作线程实例:
Worker worker1 = new Worker(1);
我使用
worker1.excute();
启动它现在,在 optionOfWork = 1 的情况下,工作程序立即启动
doInBackground()
方法。我可以在执行过程中从主线程更改 worker 的工作,如下所示:
worker1.setOptionOfWork(2);
worker1.excute();
或许:
worker1.setOptionOfWork(2);
worker1.doInBackground();
它将停止当前执行并开始执行该操作: optionOfWork = doInBackground()方法的2 ?
最佳答案
你这端有一个误解。当主线程将调用时:
worker1.setOptionOfWork(2);
worker1.doInBackground();
然后在该主线程上完成工作。准确地说:调用方法的线程然后花费时间“完成”工作。
但除此之外:当然,这样的事情是可能的。它是 worker 实现的,因此您处于完整控件中。但您必须了解:为了获得此“正确”(和合理的“架构化”),将需要进行大量工作:
如您所见,“流程”非常简单-但这需要相当多的实现工作(并且很容易出错)。
从这个意义上讲,我的建议是:如果您的线程做的工作太多,以至于您有时想“取消”它们,那么请创建较小的工作包。因此,创建多个较小的任务,而不是让一个线程忙于一项任务10分钟。并添加它们以执行。然后,“取消”意味着-不发送进一步的“小”请求。
从长远来看,这样的体系结构更容易实现,并且更健壮。