Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尽管捕获到异常,线程仍在运行_Java_Multithreading - Fatal编程技术网

Java 尽管捕获到异常,线程仍在运行

Java 尽管捕获到异常,线程仍在运行,java,multithreading,Java,Multithreading,我有5条线;main(代表银行)和我创建的其他4个自定义线程(客户机)。每个自定义线程的run方法中都有大约6条指令,这些指令在共享资源/监视器上执行一个方法。我将发布相关代码,使其简短。我要做的是在所有线程完成执行后显示一条消息。在我的情况下,其中一个线程容易死锁,为了克服死锁,我强制主线程睡眠一定时间,让所有线程都有机会完成它们的执行,一旦主线程醒来,它会检查其他线程是否还活着。。如果是,则使用.interrupt()方法引发异常。现在我期望发生的是,捕捉到中断的线程会进入一个终止状态,但奇

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

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

   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调用的监视方法:

@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上,调用interrupted之后,我希望线程捕获该异常并被终止,但我注意到,
退出方法被中断。
在控制台上打印出来,但没有
ClientB被中断。
然后执行完代码3,4,5,然后打印出
ClientB终止
,并停止。。这是为什么?

当异常在
提取中被捕获时,它会退出方法并返回,因此异常处理到此结束

更新:

如果要在
退出
方法之外继续处理
中断异常
,可以执行以下操作:

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

    {...}

    notifyAll();

}

当异常在
退出中被捕获时,它将退出方法并返回,因此异常处理到此结束

更新:

如果要在
退出
方法之外继续处理
中断异常
,可以执行以下操作:

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

    {...}

    notifyAll();

}

是的,莫里斯是对的。您不会将异常传递给调用方法

您应该将return替换为抛出新的InterruptedException(例如getMessage())


此外,如果您在退出方法中不使用try-catch,它也会执行您希望它执行的操作。

是的,Maurice是正确的。您不会将异常传递给调用方法

您应该将return替换为抛出新的InterruptedException(例如getMessage())


此外,如果您在退出方法中不使用try-catch,它也将执行您希望它执行的操作。

要在多个位置捕获相同的异常,应该重新调用它,例如:

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

    {...}

    notifyAll();

}

要在多个位置捕获同一异常,应重新捕获,例如:

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

    {...}

    notifyAll();

}

或者只是没有捕捉到异常,使用
退出(…)抛出InterruptedException
@MauricePerry请随意将其添加到您的答案中,我觉得编辑它或者只是没有捕捉到异常,并使用
退出(…)对我来说是一个很大的内容更改抛出InterruptedException
@MauricePerry可以将其添加到您的答案中,我觉得编辑它对我来说是一个很大的内容变化,我想你需要声明
撤回
可以抛出一个
Interruptedexception
我想你需要声明
撤回
可以抛出一个
Interruptedexception