我有用于多线程的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()方法。

我可以在执行过程中从主线程更改 worker 的工作,如下所示:
worker1.setOptionOfWork(2);
worker1.excute();

或许:
worker1.setOptionOfWork(2);
worker1.doInBackground();

它将停止当前执行并开始执行该操作: optionOfWork = doInBackground()方法的2

最佳答案

你这端有一个误解。当线程将调用时:

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

然后在该主线程上完成工作。准确地说:调用方法的线程然后花费时间“完成”工作。

但除此之外:当然,这样的事情是可能的。它是 worker 实现的,因此您处于完整控件中。但您必须了解:为了获得此“正确”(和合理的“架构化”),将需要进行大量工作:
  • 您需要适当的数据结构以与工作线程(例如队列)进行的通信
  • 您的工作线程需要定期检查该队列的状态
  • ,然后从那里开始:如果要“更改”正在发生的事情,则主线程将“命令”放入队列中。工作线程读取命令,并采取相应的措施。

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

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

    从长远来看,这样的体系结构更容易实现,并且更健壮。

    10-02 03:28
    查看更多