gpt4 book ai didi

java - 重写 Thread 类中的 Interrupted 和 isInterrupted 方法

转载 作者:行者123 更新时间:2023-12-02 06:05:26 26 4
gpt4 key购买 nike

在我们的应用程序中,我们有线程执行特定操作。收到事件后,我们需要中断那些正在进行的线程。这些线程将通过调用“Thread.currentThread().isInterrupted()”来检查其中断状态,如果被中断,则线程通过从 run 方法返回来停止。

我们现在看到的问题是这些线程可以在对象上 wait()。如果线程在对象上 wait() 时被中断,线程中断状态被重置并抛出InterruptedException。

自从 1)我们有很多地方线程可以等待对象 2) 线程访问可以等待某个对象的其他对象的方法

我们决定重写 Interrupt() 和 isInterrupted() 方法。代码看起来像这样:

public class MyThread extends Thread {

private boolean isInterrupted = false;

@Override
public void interrupt() {
isInterrupted = true;
super.interrupt();
}

@Override
public boolean isInterrupted() {
return isInterrupted;
}

public void run() {
.........
.........

try {
object1.wait();
} catch (InterruptedException e) {
/* if interrput() is not overrided, the interrupted flag
would be reset */
}

if(Thread.currentThread().isInterrupted()) {
/* if interrupt is not overrided, isInterrupted would return
false and the thread would continue to run. */
return;
}

object2.method1(); // method1() can also wait on another object
/* In method1() also we would need to check isInterrupted and get out
quickly as soon as possible. This method1() will also be used by
other threads which will not be interrupted. */

if(Thread.currentThread().isInterrupted()) {
return;
}
.........
.........
}
}

所以我的问题是

1) 重写上述的interrupt() 和isInterrupted() 是一个很好的编码习惯吗?

2)在重写interrupt()的同时,我们应该保持相同的行为,即抛出异常 中断和其他异常,如interrupt()方法的java文档中所述 在线程类中?实际上我们需要等待被中断的线程 但要设置中断标志。

3)静态的 Thread.interrupted() 方法怎么样? 通过上面的重写,我们不应该使用这个方法,对吗?

最佳答案

首先,重写这些方法是一个非常糟糕的主意。

第二,我不明白为什么你让你的生活变得如此艰难:

try {
doSomethingThatCanBlock();// e.g. wait()
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt(); // restore interrupt state
}

现在,下次您检查Thread 的中断状态时,它会告诉您适当的状态。就是这样。

关于java - 重写 Thread 类中的 Interrupted 和 isInterrupted 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23369891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com