thread.currentthread().isinterrupted() 多次调用会有什么影响吗
时间: 2023-08-18 17:09:01 浏览: 244
多次调用 `Thread.currentThread().isInterrupted()` 不会有任何影响。这个方法只是返回当前线程的中断状态,并不会对线程本身或其他线程产生任何影响。它只是返回一个布尔值,指示当前线程是否被中断。每次调用该方法都将返回相同的结果,除非在调用期间线程被中断或者调用了 `Thread.interrupted()` 方法来重置中断状态。
相关问题
以下说法正确的是 (ACD) A. 调用Thread.interrupt() 用于请求另外一个线程中止执行,而不是直接中止 B. 推荐使用Thread.current().isInterrupted(),而不是Thread.interrupted()检查自己是否被interrupt C. 检测到当前线程被interrupt后,应抛出InterruptedException,并在finally或try-with-resource中清理执行状态 D. 调用线程的interrupt方法,只有当线程走到了sleep, wait, join等阻塞这些方法的时候,才会抛出InterruptedException
根据给出的说法,以下是正确的:
A. 调用 `Thread.interrupt()` 用于请求另外一个线程中止执行,而不是直接中止。
C. 检测到当前线程被 `interrupt` 后,应抛出 `InterruptedException`,并在 `finally` 或 `try-with-resource` 中清理执行状态。
D. 调用线程的 `interrupt` 方法,只有当线程走到了 `sleep`、`wait`、`join` 等阻塞这些方法的时候,才会抛出 `InterruptedException`。
因此,选项 A、C 和 D 是正确的。
关于选项 B,实际上 `Thread.currentThread().isInterrupted()` 和 `Thread.interrupted()` 都可以用于检查线程是否被中断,但是它们的使用场景略有不同。`Thread.currentThread().isInterrupted()` 用于检查当前线程是否被中断,而 `Thread.interrupted()` 不仅会检查当前线程的中断状态,还会将当前线程的中断状态重置为未中断状态。因此,在某些情况下,使用 `Thread.currentThread().isInterrupted()` 可能更合适。
希望对你有所帮助!
Thread-0: started false: started Thread-0: is running Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:326) at ThreadInterrupt$1.run(ThreadInterrupt.java:11) at java.base/java.lang.Thread.run(Thread.java:835) main: stopped
这个错误是因为在线程中调用了wait()方法,但是没有获取到对象锁。wait()方法只能在synchronized块中使用,否则就会抛出IllegalMonitorStateException异常。
你可以将wait()方法调用放到synchronized块中,或者使用Lock对象来代替synchronized块。例如:
```
public void run() {
System.out.println(Thread.currentThread().getName() + ": started");
System.out.println(Thread.currentThread().isInterrupted() + ": started");
synchronized (this) {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + ": is running");
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + ": interrupted when sleep");
System.out.println(Thread.currentThread().isInterrupted() + ": interrupted getState()");
Thread.currentThread().interrupt();
System.out.println(Thread.currentThread().isInterrupted() + ": interrupted getState()");
}
}
}
System.out.println(Thread.currentThread().getName() + ": exiting");
}
```
这样修改后,就不会再出现IllegalMonitorStateException异常了。
阅读全文