是否可以重定向工作线程以在处理过程中执行其他工作?



我有一个用于多线程的 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

你这边有一个误解。当主线程调用时:

worker1.setOptionOfWork(2);
worker1.doInBackground(); 

然后工作在该线程上完成。准确地说:调用方法的线程将花费时间"执行"工作。

但除此之外:当然这样的事情是可能的。这是您的工作线程实现,因此您可以完全控制。但是您必须了解:为了获得这种"正确"(和合理的"架构"(-将需要大量工作:

  • 您需要适当的数据结构来与工作线程(例如队列(进行通信
  • 工作线程需要定期检查该队列的状态
  • 从那里开始:如果你想"改变"正在发生的事情,主线程会在队列中放入一个"命令"。工作线程读取命令,并采取相应的操作。

如您所见,"流程"非常简单 - 但这需要相当多的实现工作(并且很容易出错(。

从这个意义上说,我的建议是:如果你的线程正在做太多工作,以至于你有时想"取消"它们 - 那么创建更小的工作包。因此,与其让一个线程忙于一个任务 10 分钟,不如创建许多较小的任务。并添加它们以执行。然后"取消"意味着 - 不再发送进一步的"小"请求。

从长远来看,这种架构更容易实现,并且更健壮。

最新更新