Biorąc pod uwagę ten kod ...Nie można przerwać wątku, jeśli faktycznie jest to obliczanie?
public class SimpleTest {
@Test
public void testCompletableFuture() throws Exception {
Thread thread = new Thread(SimpleTest::longOperation);
thread.start();
bearSleep(1);
thread.interrupt();
bearSleep(5);
}
public static void longOperation(){
System.out.println("started");
try {
boolean b = true;
while (true) {
b = !b;
}
}catch (Exception e){
System.out.println("exception happened hurray!");
}
System.out.println("completed");
}
private static void bearSleep(long seconds){
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {}
}
}
Wyobraźmy sobie, że zamiast tego while(true)
masz coś, co nie rzuca przerwany wykonanie (na przykład funkcji rekurencyjnej, że faktycznie coś oblicza).
Jak zabić tę rzecz? I dlaczego nie umiera?
Uwaga, jeśli nie wstawię tam typu Exception
i nie użyję InterruptedException
, to nawet nie skompiluję, mówiąc, że nie rozumiem, dlaczego to jest "interrupted exception will never be thrown"
. Może chcę ręcznie go przerwać ...
Należy pamiętać, że za pomocą [Thread.interrupted()] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupted%28%29) * Przerwany status wątek jest czyszczony tą metodą. * – OldCurmudgeon
To prawda. Jeśli chcesz zachować status flagi "interrupted", metoda instancji [Thread.isInterrupted()] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html # is Interrupted% 28% 29) powinien być użyty zamiast tego. –