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

时间:2017-08-15 09:29:15

标签: java multithreading swingworker

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

1 个答案:

答案 0 :(得分:1)

你的结局存在误解。当线程调用时:

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

然后工作线程上完成。确切地说:线程调用方法花费时间&#34;做&#34;那时的工作。

但除此之外:当然这样的事情是可能的。它是您的工作人员实施,因此处于完整控制中。但你必须明白:为了得到这个&#34;正确&#34; (合理的&#34;架构&#34;) - 需要做很多工作:

  • 您需要一个适当的数据结构来与工作线程进行通信(例如队列)
  • 您的工作线程需要定期检查该队列的状态
  • 从那里:如果你想&#34;改变&#34;发生了什么,主线程放入一个&#34;命令&#34;进入队列。工作线程读取命令,并采取相应的行动。

正如您所看到的,&#34;流程&#34;非常简单 - 但这需要相当多的实现工作(很容易出错)。

从这个意义上说,我的建议是:如果你的线程做了很多工作,你想要&#34;取消&#34;他们有时 - 然后创建较小的工作包。因此,不是让一个线程忙于一个任务10分钟 - 创建许多较小的任务。并添加执行。然后&#34;取消&#34;意思是 - 不再发送&#34;小&#34;要求。

这种架构更容易实现,从长远来看更加强大。