Как отследить и реализовать опцию отмены для вложенного 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
}
}
}
}
и вот очень простой рабочий процесс:
Я сделал запрос, используя
fiddler
выполнить что-то. Это создаст один WorkerRunnable.В следующем запросе я хочу остановить
WorkerRunnable
началось в шаге 1.
Может случиться так, что я сделал несколько запросов, и среди них я хочу остановить любой запрос. Как отследить все WorkerRunnable и как их прервать, если приходит запрос на их остановку? Я старался ExecutorService
но не нашел точного способа использовать его в этом сценарии. Пожалуйста, предложите правильный способ сделать это.
1 ответ
Рассматривали ли вы использование пула потоков в вашем createProcess()
функционировать? Если бы вы использовали пул, то вы могли бы представить Callable
задачи в бассейн, и вернуться Future
экземпляров. Затем, в зависимости от того, как вы реализовали свой Callable
объекты, вы потенциально можете использовать Future.cancel()
способ отменить задачу.