gpt4 book ai didi

java - 线程不可中断

转载 作者:行者123 更新时间:2023-12-02 08:47:11 25 4
gpt4 key购买 nike

我正在尝试研究著名的哲学家就餐,它已经完成,但我很难尝试中断线程。

如您所知,在这个问题中我们有 5 个线程(哲学家),用户设置实验结束的实验时间。

值得注意的是,我在 StackOverflow 上查看了多个答案。

第一个来自@Konrad Reiche How do you kill a Thread in Java?/Stackoverflow link

在那篇特定的文章中,人们表示使用 volatile boolean 值作为标志可能可行,但恐怕练习纸中指出我不能使用 volatile boolean 值来中断线程,但我可以使用它用于其他目的。 (学习练习)。

第二个是Thread interrupt() does not interrupt thread/Stackoverflow link

但没有什么真正有帮助!

我会尝试提供必要的代码,希望有人能指出我的错误。Philosopher 类是公共(public)的并且扩展了 Thread!。

1)第一次尝试:(如果教授不希望我们使用 volatile boolean 值作为标志,可能会被拒绝!)

当像这样使用 volatile boolean 值时,它的工作原理:

private volatile boolean isNotStopped=true;

@Override
public void stopPhilosopher() {
System.out.printf("\n%s will stop.\n",selfPhilosopher.getName());
selfPhilosopher.interrupt();
isNotStopped=false;
}


@Override
public void run() {
while (isNotStopped){//selfPhilosopher is a thread equals to this!.
try {
think();
eat();
} catch (InterruptedException e) {//somehow this was never triggered!.
System.out.printf("%s was interrupted.\n",selfPhilosopher.getName());
}finally {//in the finally block i always get RUNNER, FALSE
System.out.printf("the %s is %s and is interrupted %b.\n", selfPhilosopher.getName(),selfPhilosopher.getState(), selfPhilosopher.isInterrupted());
}
}
}

[更新]第二次尝试:[工作中]

Thread.currentThread().isInterrupted() 替换 selfPhilosopher.isInterrupted() 没有任何区别,因为 selfPhilosopher=this; >

但是我从 stopPhilosopher() 方法中得到“将停止”,但线程似乎就像僵尸一样不断复活:(

因为我非常相信 @Konrad Reiche from the first reference的意见提供的和 @Nathan Hughes 的答案我将坚持使用 java isInterrupted() 提供的 boolean 标志,而不是使用 volatile 标志。

@Override
public void stopPhilosopher() {
System.out.printf("\n%s will stop.\n",selfPhilosopher.getName());
selfPhilosopher.interrupt();

}

@Override
public void run() {
while (!selfPhilosopher.isInterrupted()){//selfPhilosopher is a thread equals to this!.
try {
think();
eat();
} catch (InterruptedException e) {//somehow this was never triggered!.Now it works.
System.out.printf("%s was interrupted from catch clause!..\n",selfPhilosopher.getName());
selfPhilosopher.interrupt();
}
}
}

输出:

 Philosopher2 in seat nr: 2 was interrupted from catch clause!..

最佳答案

当抛出 InterruptedException 时,中断标志被清除。这意味着循环进行的下一次检查将表明线程没有中断并且线程将继续运行。这就是当您的 finally block 打印出中断标志 false 时您所看到的情况。

这在 the API doc for the sleep method 中有描述。 :

InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

将此行添加到捕获 InterruptedException 的 block 中:

Thread.currentThread().interrupt();  // restores interrupt flag

关于java - 线程不可中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61001938/

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