Java - переключение обратно в основной поток? - PullRequest
6 голосов
/ 05 марта 2009

Как я могу вернуться к основному потоку из другого потока, когда есть исключение. Когда возникает исключение в дочернем потоке, я хочу, чтобы уведомление было отправлено в основной поток и выполнить метод из основного потока. Как я могу это сделать?

Спасибо.

Дополнительная информация

Я вызываю метод из основного метода и запускаю новый поток после некоторых вычислений и изменений

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

Ответы [ 5 ]

3 голосов
/ 05 марта 2009

Как говорит TofuBeer, вам нужно предоставить больше контекста, если, тем не менее, этот контекст является тем, что вы - приложение-качель ...

SwingUtilities.invokeLater (Runnable r) позволяет вам перезвонить в основной поток выполнения Swing.

} catch (final Exception e) {
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
           //do whatever you want with the exception
        }
    }); 
}
3 голосов
/ 05 марта 2009

Когда возникает исключение в дочернем потоке, что будет делать основной поток? Это должно быть ожидание любых ошибок в дочернем потоке.

Вы можете установить UncaughtExceptionHandler в дочернем потоке, который может вызвать событие, которого ожидает основной поток.

1 голос
/ 05 марта 2009

Если ваш дочерний поток был создан в основном, вы можете оставить всплывающее исключение и обработать его в основном потоке.

Вы также можете перезвонить.

Хотя я сам не пробовал это.

0 голосов
/ 05 марта 2009

Реализуйте интерфейс http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html в некотором классе вашего приложения, и пусть он работает с потоком и сгенерированным им исключением.

Подробнее см. Документ.

РЕДАКТИРОВАТЬ: Это, вероятно, не то, что вы хотели - я полагаю, что метод будет вызываться потоком, который только что вызвал исключение. Если вы хотите, чтобы какой-либо метод был выполнен в вашем основном потоке (в его контексте), основной поток должен будет как-то его ждать.

Но если вы хотите обработать исключение, это один случай. Считается, что лучший подход - обработать исключение в блоке try ... catch внутри вашего потока.

0 голосов
/ 05 марта 2009

Это может работать на вас.

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...