Как отследить и реализовать опцию отмены для вложенного Runnable в Java

Я работаю над приложением Java, которое использует ZMQ обработать запрос. Мой код имеет несколько вложенных 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 но не нашел точного способа использовать его в этом сценарии. Пожалуйста, предложите правильный способ сделать это.

1 ответ

Рассматривали ли вы использование пула потоков в вашем createProcess() функционировать? Если бы вы использовали пул, то вы могли бы представить Callableзадачи в бассейн, и вернуться Future экземпляров. Затем, в зависимости от того, как вы реализовали свой Callable объекты, вы потенциально можете использовать Future.cancel() способ отменить задачу.

Другие вопросы по тегам