В моем приложении каждый запрос имеет свой собственный поток. Я использую JMX/JConsole для их мониторинга, измерения прошедшего времени. Если запрос требует слишком много времени, я хотел бы остановить его, прервав основной поток. В методе, который я вызываю из JConsole, я перебираю список потоков и вызываю прерывание() в нужном экземпляре.
Однако просто вызов метода interrupt() в экземпляре потока только устанавливает флаг, поэтому мне нужно также бросить InterruptedException. Но это InterruptedException будет применяться к currentThread вместо потока, который я действительно хочу остановить. Любой намек на то, как закрыть отмеченный поток?Как отключить поток от другого?
while (iterator.hasNext()) {
RequestHolder rh = iterator.next();
if (rh.getThread().getId() == threadId) {
rh.getThread().interrupt();
if(rh.getThread().isInterrupted()){
throw new InterruptedException();
}
}
}
только для заметки - некоторые блокирующие сторонние функции могут обернуть InterputException в некоторых других, например IOException или так (Axis). поэтому всегда проверяйте, не перепутаны ли они. – JIV