我可以重定向工作线程以在处理过程中执行不同的工作吗?
Can I redirect a worker thread to do a different job in middle of processing?
我有一个用于多线程的 Worker class。
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();
启动它
现在worker在optionOfWork = 1的情况下立即启动doInBackground()
方法。
我可以像这样在执行过程中(从主线程)更改工作人员的工作吗:
worker1.setOptionOfWork(2);
worker1.excute();
或者也许:
worker1.setOptionOfWork(2);
worker1.doInBackground();
它会停止当前的执行并开始执行案例:optionOfWork = 2 doInBackground() 方法?
你这边理解有误。当 main 线程调用时:
worker1.setOptionOfWork(2);
worker1.doInBackground();
然后 work 在 main 线程上完成。准确地说:线程调用方法然后花费时间"doing"工作。
但除此之外:当然这样的事情是可能的。它是 您的 工作人员实施,因此 您 处于 完全 控制之下。但是你必须明白:为了得到这个"correct"(并且合理"architected")——需要做很多工作:
- 您需要一个适当的数据结构来与工作线程(例如队列)
通信
- 您的工作线程需要定期检查该队列的状态
- 从那里开始:如果您想 "change" 发生了什么,主线程将 "command" 放入队列中。工作线程读取命令,并据此采取行动。
如您所见,"flow" 非常简单 - 但这需要相当多的实现工作(并且很容易出错)。
从这个意义上说,我的建议是:如果您的线程正在做很多工作,以至于您有时想要 "cancel" 它们 - 然后创建较小的工作包。因此,与其让一个线程为一项任务忙 10 分钟,不如创建许多更小的任务。并添加那些执行。然后 "cancel" 意味着 - 不再发送 "small" 请求。
这样的架构更容易实现,并且在长期 运行 中更健壮。
我有一个用于多线程的 Worker class。
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();
启动它
现在worker在optionOfWork = 1的情况下立即启动doInBackground()
方法。
我可以像这样在执行过程中(从主线程)更改工作人员的工作吗:
worker1.setOptionOfWork(2);
worker1.excute();
或者也许:
worker1.setOptionOfWork(2);
worker1.doInBackground();
它会停止当前的执行并开始执行案例:optionOfWork = 2 doInBackground() 方法?
你这边理解有误。当 main 线程调用时:
worker1.setOptionOfWork(2);
worker1.doInBackground();
然后 work 在 main 线程上完成。准确地说:线程调用方法然后花费时间"doing"工作。
但除此之外:当然这样的事情是可能的。它是 您的 工作人员实施,因此 您 处于 完全 控制之下。但是你必须明白:为了得到这个"correct"(并且合理"architected")——需要做很多工作:
- 您需要一个适当的数据结构来与工作线程(例如队列) 通信
- 您的工作线程需要定期检查该队列的状态
- 从那里开始:如果您想 "change" 发生了什么,主线程将 "command" 放入队列中。工作线程读取命令,并据此采取行动。
如您所见,"flow" 非常简单 - 但这需要相当多的实现工作(并且很容易出错)。
从这个意义上说,我的建议是:如果您的线程正在做很多工作,以至于您有时想要 "cancel" 它们 - 然后创建较小的工作包。因此,与其让一个线程为一项任务忙 10 分钟,不如创建许多更小的任务。并添加那些执行。然后 "cancel" 意味着 - 不再发送 "small" 请求。
这样的架构更容易实现,并且在长期 运行 中更健壮。