Java - 切换回主线程?

时间:2009-03-05 06:00:13

标签: java multithreading

如果出现异常,如何从其他线程切换回主线程。当在子线程上引发异常时,我希望将通知发送到主线程并从主线程执行方法。我怎么能这样做?

感谢。

其他信息

我从main方法调用一个方法,并在经过一些计算和更改后在那里开始一个新线程

Thread thread = new Thread() {
    @Override
    public void run() {
        .....
    }
}
thread.start();

5 个答案:

答案 0 :(得分:3)

当子线程发生异常时,主线程将会做什么?对于子线程中的任何错误,它必须等待

您可以在子线程中建立UncaughtExceptionHandler,这可能会引发主线程正在等待的事件。

答案 1 :(得分:3)

正如TofuBeer所说,你需要提供更多的背景信息,但是如果你认为这是一个摇摆应用......

SwingUtilities.invokeLater(Runnable r)允许你回调Swing的主执行线程。

} catch (final Exception e) {
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
           //do whatever you want with the exception
        }
    }); 
}

答案 2 :(得分:1)

如果你的子线程是在main中创建的,你可能会弹出异常并在主线程上处理它。

你也可以回拨一下。

我没有试过这个我的自我。

答案 3 :(得分:0)

在应用程序的某个类中实现接口http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html,让它处理线程及其生成的异常。

有关详细信息,请参阅文档。

编辑:这可能不是你想要的 - 我相信该方法将由刚刚抛出异常的线程调用。如果你想在主线程上执行一些方法(在它的上下文中),主线程必须以某种方式等待它。

但是如果你只想处理一个例子的异常。想到,最好的方法是在线程内的try ... catch块中处理异常。

答案 4 :(得分:-2)

可能适合您。

public class Main
{
    public static void main(final String[] argv)
    {
        final Main main;

        main = new Main();
        main.go();
    }

    public void go()
    {
        final Runnable runner;
        final Thread   thread;

        runner = new Foo(this);
        thread = new Thread(runner);
        thread.start();
    }

    public void callback()
    {
        System.out.println("hi!");
    }
}

class Foo
    implements Runnable
{
    private final Main main;

    Foo(final Main m)
    {
        main = m;
    }

    public void run()
    {
        // try catch and handle the exception - the callback is how you notify main
        main.callback();
    }
}