Thread.interrupt():
Interrupts this thread. Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
If this thread is blocked in an I/O operation upon an InterruptibleChannel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.
If none of the previous conditions hold then this thread's interrupt status will be set.
Interrupting a thread that is not alive need not have any effect.
Lets say we have this code:
AtomicBoolean thread1Done = new AtomicBoolean(false);
//write in file
Thread thread1 = new Thread(() -> {
try(var writer = Files.newBufferedWriter(Paths.get("foo.txt"))){
for(int i = 0; i < 10000; i++){
writer.write(i);
writer.newLine();
}
}catch(Exception e){ e.printStackTrace(); }
thread1Done.set(true);
});
//interrupt thread1
Thread thread2 = new Thread(() -> {
while(!thread1Done.get()){
thread1.interrupt();
}
});
thread2.start();
thread1.start();
thread1 never writes anything in the file because of thread1.interrupt() from thread2.
It always ends with java.nio.channels.ClosedByInterruptException at writer.newLine(); and foo.txt is empty.
Is there a way to interrupt only wait, join and sleep, and ignore the rest?
I run my code with JDK10 on Windows10 x64.