Java: уничтожение потока, запущенного как Runnable с помощью ExecutorServiceJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java: уничтожение потока, запущенного как Runnable с помощью ExecutorService

Сообщение Anonymous »

У меня есть система, которая запускает рабочие процессы, когда получает для этого вызов от веб-сервиса. Рабочие запускаются с помощью ExecutorService, запускаемый класс реализует Runnable. Однако если рабочий процесс истечет, я не смогу его фактически убить, что приводит к проблемам с ресурсами в моей системе.

Код: Выделить всё

public class MyClass implements Runnable {

public void internalCall() {
logger.info("B-1");
//Some business code which may take too long
// 
logger.info("B-2");
}

public void launch() {
// Wrapper
Callable callable = new Callable() {
@Override
public Object call() throws Exception {
internalCall();
return null;
}
};

// Submit
ExecutorService executor = Executors.newSingleThreadExecutor();
Future future = executor.submit(callable);

try {
// Wait
future.get(1, TimeUnit.SECONDS);
}
catch (TimeoutException e) {
logger.warn("Timeout");
}
finally {
logger.info("A-1");
executor.shutdownNow();
future.cancel(true);
logger.info("A-2");
}
}
}
Если у рабочего истекает время ожидания, я ожидаю следующее сообщение журнала:

Код: Выделить всё

INFO | B-1
WARN | Timeout
INFO | A-1
INFO | A-2
После этого служба остается бездействующей до тех пор, пока не поступит другой рабочий запрос. Однако, несмотря на вызовы ShutdownNow() и Cancel() в ExecutorService и Future, рабочий процесс продолжает:

Код: Выделить всё

INFO | B-1
WARN | Timeout
INFO | A-1
INFO | A-2
INFO | B-2
Я осмотрелся и обнаружил ряд других похожих вопросов об уничтожении потоков, при этом общее мнение заключается в том, что вам не следует этого делать. Однако это класс, который можно расширить с намерением переопределить InternalCall() - это означает, что я не могу полагаться на InternalCall, чтобы контролировать себя и проверять Thread.isInterrupted() или что-то в этом роде.

Я бы хотел просто принудительно уничтожить объекты из метода launch(), атаковав объект Furure или executor.

Подробнее здесь: https://stackoverflow.com/questions/298 ... torservice
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»