我有一个用于多线程的 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 分钟,不如创建许多较小的任务。并添加它们以执行。然后"取消"意味着 - 不再发送进一步的"小"请求。
从长远来看,这种架构更容易实现,并且更健壮。