Issue
I try to consider with multithreading and with interrupt() method:
public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().isInterrupted());
Runnable target = new Runnable() {
@Override
public void run() {
try {
System.out.println("From thread-run(): " + Thread.currentThread().isInterrupted());
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("From thread-catch(): " + Thread.currentThread().isInterrupted());
}
}
};
Thread someThread = new Thread(target);
System.out.println("Before start(): " + someThread.isInterrupted());
someThread.start();
Thread.sleep(1000);
System.out.println("After start(): " + someThread.isInterrupted());
someThread.interrupt();
Thread.sleep(1000);
System.out.println("After interrupt: " + someThread.isInterrupted());
}
As I understood, the interrupt()
method set flag interrupt
to true
. In this case, the thread supposed to be stopped immediately, but my code return false
in all cases:
I changed my method in the way when the thread interrupt himself:
public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().isInterrupted());
Runnable target = new Runnable() {
@Override
public void run() {
System.out.println("From thread-run(): " + Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt();
}
};
Thread someThread = new Thread(target);
System.out.println("Before start(): " + someThread.isInterrupted());
someThread.start();
Thread.sleep(1000);
System.out.println("After start(): " + someThread.isInterrupted());
Thread.sleep(1000);
System.out.println("After interrupt: " + someThread.isInterrupted());
}
But the result is the same:
I supposed, the From thread-catch():
and After interrupt:
lines should have returned true instead of false - why isInterrupted() == false if the thread was interrupted?
the answer from Why do InterruptedExceptions clear a thread's interrupted status? do not acceptable for my case since in the second case the InterruptException
do not happen and
- a) not "would have to explicitly clear that flag":
- b) I used
Thread.currentThread().interrupt()
- anyway I gotfalse
- c) The
interrupt()
was handled once
Solution
Take a look at the javadoc of someThread.isInterrupted()
method: 'A thread interruption ignored because a thread was not alive at the time of the interrupt will be reflected by this method returning false.' - I think it is the reason.
Also you should know, that you must listen for 'interrupted status' on yourself. By checking Thread.currentThread().isInterrupted()
. And then may be throw new InterruptedException()
on yourself.
Try the code below. The loop logic just for 'waiting' - you cannot use Thread.sleep(10_000)
after thread interrupted.
public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().isInterrupted());
Runnable target = new Runnable() {
@Override
public void run() {
System.out.println("From thread-run(): " + Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt();
System.out.println("After interruption");
long sum = 0;
Random r = new Random();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
sum += r.nextInt(3);
}
System.out.println(sum);
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("InterruptedException");
}
}
};
Thread someThread = new Thread(target);
System.out.println("Before start(): " + someThread.isInterrupted());
someThread.start();
Thread.sleep(1000);
System.out.println("After start(): " + someThread.isInterrupted());
}
Outputs:
false
Before start(): false
From thread-run(): false
After interruption
After start(): true
2147470801
java.lang.InterruptedException: sleep interrupted
at java.base/java.lang.Thread.sleep(Native Method)
at ru.eta2.Test$1.run(Test.java:20)
at java.base/java.lang.Thread.run(Thread.java:834)
InterruptedException
Process finished with exit code 0
Answered By - Timur Efimov
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.