【问题标题】:Catching exceptions from another threads?从另一个线程捕获异常?
【发布时间】:2011-11-11 23:47:55
【问题描述】:

我正在编写一个使用多个线程的应用程序。有一个主线程正在启​​动另一个线程。我想要完成的是当启动的线程之一抛出异常时,主线程应该停止启动线程。它看起来或多或少是这样的:

class SomeClass {
boolean launchNewThread = true;
public static void main() {
    while (launchNewThread) {
        try {
            AnotherClass.run();
        } catch (CrossThreadException e) {
            launchNewThread = false;
        }
    }
}
}

class AnotherClass implements Runnable {
    public void run() {
        if (a=0) throw new CrossThreadException();
}

}

【问题讨论】:

    标签: java multithreading exception


    【解决方案1】:

    您应该自己做 - 捕获异常并以某种方式将其传递给启动线程。

    此外,还有Future 概念,它已经做到了。你应该将你的线程作为future启动并检查isDone(),并从get()中捕获ExecutionException,如果future的任务抛出异常,就会抛出这个异常。

    【讨论】:

      【解决方案2】:

      你也可以使用How to throw a checked exception from a java thread?中描述的监听器

      当在其中一个子线程中引发异常时,您可以从子线程调用类似listener.setLaunchNewThread(false) 的方法,这将更改您在父线程中的布尔标志的值。

      附带说明,调用AnotherClass.run() 不会启动新线程,而只会在同一线程中从AnotherClass 调用run 方法。请改用new Thread(new AnotherClass()).start()

      【讨论】:

      • 是的,我知道,上面的代码只是一个......我会说伪代码。更重要的是,我不希望主线程等待其他线程。它必须启动 10 个“子”线程,如果其中没有发生异常,则能够启动接下来的 10 个线程。
      • 主线程不必等待。它将继续创建线程,除非 launchNewThread 的值被其中一个子线程通过侦听器更改。
      猜你喜欢
      • 2010-09-16
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多