Java: создание многопоточного ридера - PullRequest
3 голосов
/ 30 сентября 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Может быть, ExecutorCompletionService может вам помочь.Отправленные задачи помещаются в очередь после завершения.Вы можете использовать методы take или poll в зависимости от того, хотите ли вы ждать или нет задачи, доступной в очереди выполнения.

ExecutorCompletionService javadoc

1 голос
/ 30 сентября 2011

Используйте ExecutorService с пулом потоков размером> 1, публиковать пользовательские производные FutureTask, которые переопределяют метод done(), чтобы сигнализировать о завершении задачи для пользовательского интерфейса:

public class MyTask extends FutureTask<MyModel> {
  private final MyUI ui;

  public MyTask(MyUI toUpdateWhenDone, Callable<MyModel> taskToRun) {
    super(taskToRun);
    ui=toUpdateWhenDone;
  }
  @Override
  protected void done() {
    try {
      // retrieve computed result
      final MyModel computed=get();
      // trigger an UI update with the new model
      java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
           ui.setModel(computed); // set the new UI model
        }
      });
    }
    catch(InterruptedException canceled) {
       // task was canceled ... handle this case here
    }
    catch(TimeoutException timeout) {
      // task timed out (if there are any such constraints). 
      // will not happen if there are no constraints on when the task must complete
    }
    catch(ExecutionException error) { 
      // handle exceptions thrown during computation of the MyModel object...
      // happens if the callable passed during construction of the task throws an 
      // exception when it's call() method is invoked.
    }
  }
}

ПРАВКА: Для более сложных задач, которые должны сигнализировать об обновлениях состояния, может быть хорошей идеей создать пользовательские производные SwingWorker таким образом и опубликовать эти на ExecutorService.(На данный момент вы не должны пытаться запускать несколько SwingWorkers одновременно, поскольку текущая реализация SwingWorker фактически не позволяет этого.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...