Путаница с заморозкой службы исполнителя - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь запустить Swing Worker, используя службу Executor Service, и происходит нечто странное. В настоящее время я использую метод newSingleThreadExecutor();, а также следующее:

Future<?> f = execService.submit(swingWorker);
JOptionPane.showMessageDialog(null, "Created Future");
f.get(120, TimeUnit.SECONDS);

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

Если я запускаю Swingworker самостоятельно, без помощи execService, он работает отлично, но, конечно, функция тайм-аута недоступна, и это единственная цель этого. Должен ли я просто использовать таймер вместо этого?

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Если это выглядит примерно так:

public void closeDialog(){
    SwingUtitilies.invokeLater(new Runnable(){
      public void run(){
          Future<?> f = execService.submit(swingWorker);
          JOptionPane.showMessageDialog(null, "Created Future");
          f.get(120, TimeUnit.SECONDS);
      }
    });
}

Вы блокируете (приостанавливаете) EDT. f.get() будет блокироваться до завершения обработки Future.

1 голос
/ 13 февраля 2012

Future.get() - это блокирующий вызов. Он ожидает, пока задача не будет выполнена, или пока не истечет время ожидания. Поэтому, вызывая его в EDT, вы делаете именно то, что пытаетесь избежать, используя SwingWorker.

0 голосов
/ 13 февраля 2012

Я не эксперт по Swing, но в Java Concurrency на практике упоминается, что Swing использует свой собственный поток для управления пользовательским интерфейсом, и вы не должны вмешиваться в него. Может быть, в этом проблема.

...