我有这个用于多线程的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()
方法。
我可以在执行过程中更改(从主线程)工作人员的工作,如下所示:
worker1.setOptionOfWork(2);
worker1.excute();
或者也许:
worker1.setOptionOfWork(2);
worker1.doInBackground();
它将阻止当前的执行并开始排除案例:doInBackground()方法的 optionOfWork = 2 ?
答案 0 :(得分:1)
你的结局存在误解。当主线程调用时:
worker1.setOptionOfWork(2);
worker1.doInBackground();
然后工作在主线程上完成。确切地说:线程调用方法花费时间&#34;做&#34;那时的工作。
但除此之外:当然这样的事情是可能的。它是您的工作人员实施,因此您处于完整控制中。但你必须明白:为了得到这个&#34;正确&#34; (合理的&#34;架构&#34;) - 需要做很多工作:
正如您所看到的,&#34;流程&#34;非常简单 - 但这需要相当多的实现工作(很容易出错)。
从这个意义上说,我的建议是:如果你的线程做了很多工作,你想要&#34;取消&#34;他们有时 - 然后创建较小的工作包。因此,不是让一个线程忙于一个任务10分钟 - 创建许多较小的任务。并添加执行。然后&#34;取消&#34;意思是 - 不再发送&#34;小&#34;要求。
这种架构更容易实现,从长远来看更加强大。