В потоке отправки событий --- хотите выйти из него

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

Есть ли способ запустить некоторый код в потоке, отличном от EDT, на данный момент?

Я пробовал это:

        if (SwingUtilities.isEventDispatchThread()) {
            new Runnable() {
                @Override
                public void run() {
                    myMethod();
                }
            }.run();
        } else {
            myMethod();
        }

Но myMethod() заработал в EDT, даже когда я создал новый Runnable.

Есть ли способ запустить myMethod() в потоке, отличном от EDT на данный момент?


person Paul Reiners    schedule 22.04.2014    source источник
comment
Вы можете проверить файл current thread name. По умолчанию это будет что-то вроде AWT-EventQueue-0 для потоков EDT.   -  person Braj    schedule 22.04.2014
comment
Я знаю, как определить, что я в очереди событий AWT. Проблема в том, что я на нем и хочу, чтобы какой-то код запускался не в очереди событий AWT.   -  person Paul Reiners    schedule 22.04.2014


Ответы (1)


Ты делаешь это просто отлично. Но ваш Runnable должен быть передан в новый поток.

e.g.

new Thread(new Runnable() {
 @Override
 public void run() {
     myMethod();
 }
}).start();

Обратите внимание, что вызов метода run() не запускает новый поток. Вместо этого используйте start().

См. также http://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html

person Marcinek    schedule 22.04.2014
comment
Стоит отметить, что использование ExecutorService позволит повторно использовать потоки в долгосрочной перспективе. - person Giovanni Botta; 23.04.2014