【问题标题】:Can I redirect a worker thread to do a different job in middle of processing?我可以重定向工作线程以在处理过程中执行不同的工作吗?
【发布时间】:2017-08-15 09:29:15
【问题描述】:

我有这个用于多线程的 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 的情况下,worker 立即启动doInBackground() 方法。

我可以像这样在执行过程中改变(从主线程)工人的工作吗:

worker1.setOptionOfWork(2);
worker1.excute();    

或者也许:

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

它会停止当前的执行并开始执行案例:doInBackground() 方法的 optionOfWork = 2

【问题讨论】:

  • 不,你至少必须打断工人,而且它很可能会失去他之前处理的所有内容。除非您专门编写可中断性和处理检查点,否则它将不再是默认工作器。
  • 另外,doInBackground() 强制你的调用线程执行计算。
  • 感谢您对我的回答的反馈 ;-)

标签: java multithreading swingworker


【解决方案1】:

你有一个误解。 ma​​in 线程何时调用:

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

然后 work 在那个 main 线程上完成。准确地说:调用方法的线程会花时间“做”工作。

但除此之外:当然,这样的事情是可能的。它是您的工作者实现,因此处于完全控制之中。但是你必须明白:为了得到这个“正确”(和合理的“架构”)——需要做很多工作:

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

如您所见,“流程”非常简单 - 但这需要相当多的实施工作(而且很容易出错)。

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

这样的架构更容易实现,从长远来看更健壮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2013-03-09
    相关资源
    最近更新 更多