Я сделал простой тест, и код, как показано ниже:Почему поток не может быть прерван в ExecutorService?
public class InterruptTest
{
public static class MyTask implements Runnable {
@Override
public void run() {
System.out.println("before sleep " + Thread.currentThread().isInterrupted());
System.out.println(Thread.currentThread());
Thread.currentThread().interrupt();
System.out.println("after sleep " + Thread.currentThread().isInterrupted());
}
}
public static void main(String[] str)
{
ExecutorService service = Executors.newFixedThreadPool(1);
// MyTask task1 = new MyTask();
Future<?> future1 = service.submit(new InterruptTest.MyTask());
Future<?> future2 = service.submit(new InterruptTest.MyTask());
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
System.out.println("interrupted;");
}
}
}
И выход:
before sleep false
Thread[pool-1-thread-1,5,main]
after sleep true
**before sleep false** // line 4
Thread[pool-1-thread-1,5,main]
after sleep true
почему линия 4 до сих пор выход ложным? не правда ? Потому что в текущем пуле есть только один поток, и он должен был быть прерван в первой задаче, почему он все еще доступен (не прерывается) при выполнении второй задачи?
Заранее благодарен!
Другой вопрос, я могу изменить функцию запуска, как показано ниже:
public static class MyTask implements Runnable {
@Override
public void run() {
System.out.println("before sleep " + Thread.currentThread().isInterrupted());
System.out.println(Thread.currentThread());
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
System.out.println("interrupted;");
System.out.println("after sleep " + Thread.currentThread().isInterrupted());
System.out.println(Thread.currentThread());
}
}
}
И выход одной задачи является:
before sleep false
Thread[pool-1-thread-1,5,main]
interrupted;
after sleep false
Задача должна быть просыпался от сна Thread.interrupt. Но когда я использую Thread.currentThread(). IsInterrupted(), чтобы проверить его, он все равно возвращает false.
Будет спать() есть прерывающее состояние ??
Нет, 'sleep()' не проглатывает прерванное состояние. Бросание 'InterruptedException' (несколько извращенно) не приводит к тому, что прерванный флаг устанавливается на прерванный поток: поэтому вам нужно вручную переинтерпретировать текущий поток, если вы поймаете' InterruptedException', и вы не хотите или не можете распространять это исключение, но вы хотите сохранить доказательства того, что поток был прерван для вызывающих. –
@AndyTurner Спасибо! – oyjh