首页 > 解决方案 > 如何在java中跟踪和实现嵌套Runnable的取消选项

问题描述

我正在开发一个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. 在下一个请求中,我想停止WorkerRunnable在步骤 1 中启动。

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

标签: javamultithreadingrunnableexecutorservicethreadpoolexecutor

解决方案


您是否考虑过在您的函数中使用线程池createProcess()?如果您使用池,那么您可以将Callable 任务提交到池,并取回Future实例。然后,根据您实现Callable对象的方式,您可能会使用该Future.cancel()方法中止任务。


推荐阅读