gpt4 book ai didi

java - 在以下情况下使用 isInterrupted 而不是 interrupted 会更好吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:39:16 24 4
gpt4 key购买 nike

当我修改一些旧代码时,我遇到了。

public void stop() {
if (this.simulationThread != null) {
this.simulationThread.interrupt();

try {
this.simulationThread.join();
}
catch (InterruptedException exp) {
log.error(null, exp);
}

this.simulationThread = null;
}
}

public void run() {
while (!Thread.interrupted() && simulationThread == Thread.currentThread()) {
}
}

我在想,是好用还是无所谓?

public void run() {
Thread t = Thread.currentThread();
// Will it better to use isInterrupted, since it will not clear the interrupt
// flag?
while (!t.isInterrupted() && simulationThread == t) {
}
}

最佳答案

这取决于您打算在 run() 退出时发生什么。如果您的 run() 函数是您的主线程循环,您希望该线程在 run() 完成后立即退出,然后使用 吞下中断标志Thread#interrupted() 没问题。

不过,通常情况下,这不是您想要做的。如果您尝试启用 run() 函数的正常退出以允许合作取消,最好的形式是为您的调用者保留中断标志并供下游阻塞函数检测。为此,使用 Thread#isInterrupted() 是更好的选择。

请注意,在您的 stop() 函数中,当您捕获 InterruptedException 时,您还应该调用

Thread.currentThread().interrupt();

从此处发布的代码片段中并不清楚谁在调用 stop() 以及之后应该发生什么,但是,同样,最好保留弹出的中断标志 Thread#join() 中停止 ()。仅捕获 InterruptedException 允许 stop() 对该中断使用react,但没有调用者或后续阻塞函数能够检测到针对当前线程的中断请求。换句话说,中断一个线程很少能通过解除一个阻塞函数调用来满足;中断请求通常需要一直传播回线程的主函数,以便它可以退出。

最后,您的 simulationThread 字段是否易变?

关于java - 在以下情况下使用 isInterrupted 而不是 interrupted 会更好吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705751/

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