如何在Java中跟踪和实现嵌套Runnable的cancel选项

时间:2018-08-30 10:01:37

标签: java multithreading runnable executorservice threadpoolexecutor

我正在使用ZMQ处理请求的Java应用程序。我的代码中有一些嵌套的Runnable,如下所示:

private class SomeRunnable implements Runnable {
    @Override
    public void run() {
        while (!stop) {
            try {
                createProcess();
            }
            catch (Exception e) {
                //handled
            }
        }
    }
}

public void createProcess(){
    ZMsg receivedRequest = receiveReq(); // wait for request
    Runnable workerRunnable = new WorkerRunnable(receivedRequest, this);
    Thread workerThread = new Thread(workerRunnable);
    workerThread.start();
}

因此,每次我使用Fiddler发送请求时,它将创建新的WorkerRunnable并将zmq请求传递给它以进行进一步处理。 此WorkerRunnable定义为:

private class WorkerRunnable implements Runnable {
    @Override
    public void run() {
            try {
                // do something with received request
                switch(type) : 
                case EXECUTE:
                    startExecution(); // this will internally create one more thread
                    break;

                case STOP:
                    stopExecution();
                    break;                      
            }
            catch (Exception e) {
                //handled
            }
        }
    }
}

这是非常简单的工作流程:

  1. 我使用fiddler发出了执行某项请求。它将创建一个WorkerRunnable。

  2. 在下一个请求中,我要停止在步骤1中启动的WorkerRunnable

可能发生了我发出多个请求,然后在其中我想停止任何一个请求的情况。如何跟踪所有WorkerRunnable,以及在请求停止它们时如何中断它们? 我尝试了ExecutorService,但是在这种情况下没有找到使用它的确切方法。请提出正确的方法。

1 个答案:

答案 0 :(得分:0)

您是否考虑过在createProcess()函数中使用 thread pool ?如果您使用的是游泳池,则可以提交Callable 任务添加到池中,并返回Future个实例。然后,根据实现Callable对象的方式,您可能可以使用Future.cancel()方法来中止任务。