我可以重定向工作线程以在处理过程中执行不同的工作吗?

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(); 

然后 workmain 线程上完成。准确地说:线程调用方法然后花费时间"doing"工作。

但除此之外:当然这样的事情是可能的。它是 您的 工作人员实施,因此 处于 完全 控制之下。但是你必须明白:为了得到这个"correct"(并且合理"architected")——需要做很多工作:

  • 您需要一个适当的数据结构来与工作线程(例如队列)
  • 通信
  • 您的工作线程需要定期检查该队列的状态
  • 从那里开始:如果您想 "change" 发生了什么,主线程将 "command" 放入队列中。工作线程读取命令,并据此采取行动。

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

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

这样的架构更容易实现,并且在长期 运行 中更健壮。