Как отследить и реализовать опцию отмены для вложенного Runnable в Java - PullRequest
0 голосов
/ 30 августа 2018

Я работаю над приложением 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 Ответ

0 голосов
/ 30 августа 2018

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

...