gpt4 book ai didi

java - 尽管捕获了异常,线程仍然运行

转载 作者:行者123 更新时间:2023-12-01 17:53:07 25 4
gpt4 key购买 nike

我有 5 个线程; main(代表银行)和我创建的其他 4 个自定义线程(客户端)。每个自定义线程的 run 方法中都有大约 6 条指令,这些指令在共享资源/监视器上执行一个方法。我将发布相关代码以保持简短。我想要做的是在所有线程完成执行后显示一条消息。在我的情况下,其中一个线程很容易陷入死锁,为了克服它,我强制主线程 hibernate 一定时间,让所有线程有机会完成执行,一旦主线程醒来,它就会检查如果其他线程还活着……如果是,则使用 .interrupt() 方法抛出异常。现在我期望发生的是捕获中断的线程进入终止状态,但奇怪的是它没有,并且仍然保持其运行状态。我注意到它继续执行其 run 方法中的语句,但在使其进入 wait 状态的语句之后。

在主线程中,我检查 clientB 线程是否处于 Activity 状态,如果是,则抛出异常。

   if(clientB.isAlive()){
clientB .interrupt();
}

ClientB 的 run 方法是一个简单的基本 run 方法,它从监视器调用方法。

@Override
public void run() {
System.out.println(threadName + " is in ThreadGroup: " + threadGroupName);
threadState = Student.currentThread().getState().name();
System.out.println("State of studentThread: " + threadState);
Random rnd = new Random();

try {

Code number 1
{...}

Code number 2
{...}

Code number 3
{...}

Code number 4
{...}

Code number 5
{...}
System.out.println("ClientB Terminating");
} catch (InterruptedException ex) {
ex.printStackTrace();
System.out.println("ClientB got interuppted.");
return;
}
}

如您所见,我在 ClientB 的 run 方法中没有任何 while 循环或任何内容。这是ClientB调用的monitor方法:

@Override
public synchronized void withdrawal(Transaction t) {
while (t.getAmount() > this.balance) {
try {
wait();
} catch (InterruptedException ex) {
System.out.println("Withdrawal method interuppted.");
return;
}
}

{...}

notifyAll();

}

现在,当我给 main 方法 10 秒的时间让所有线程完成其操作时,除了 ClientB 的方法代码 2 上的 ClientB 之外,所有其他线程似乎都在这段时间内完成,并且在调用中断之后,我希望线程能够捕获那个异常并被杀死,但我注意到的是 Withdrawal 方法被中断。 在控制台上打印出来,但 ClientB 被中断。 然后它就完成了执行代码 3,4,5,然后打印出 ClientB Termination 并停止..这是为什么?

最佳答案

withdrawal中捕获异常时,它会返回并退出该方法,因此异常的处理到此结束。

更新:

如果你想在withdrawal方法之外继续处理InterruptedException,你可以这样做:

@Override
public synchronized void withdrawal(Transaction t) throws InterruptedException {
while (t.getAmount() > this.balance) {
wait();
}

{...}

notifyAll();

}

关于java - 尽管捕获了异常,线程仍然运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47773584/

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