Как реализовать многопоточный пул в Java - PullRequest
3 голосов
/ 25 февраля 2011

У меня есть сценарий, в котором я использую потоки.

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

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

Эти два потока работают непрерывно, один проверяет наличие новых файлов, другой обрабатывает новые файлы.

Теперь мне нужно обрабатывать три файла одновременно с запущенными тремя потоками.Когда один поток завершает обработку, другой поток берет другое имя файла из списка и запускает процесс.

Таким образом, мне нужен какой-то механизм, чтобы иметь три потока и проверять их, живы они или нет, и соответственно запускает новый поток исписок файлов также часто обновляется.

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

Спасибо, Сандип

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

Основываясь на существующих ответах, ваш код будет выглядеть примерно так:

    final ExecutorService executor = Executors.newFixedThreadPool(2);

    final FilePoller poller = ...
    final FileProcessor processor = ...

    new Thread(new Runnable() 
      { 
        @Override
        public void run() 
        {
          while (true)
          {
            final File file = poller.pollForFile();
            executor.submit(new Runnable() { public void run() { processor.processFile(file); } } );
          }
        }
      });

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

0 голосов
/ 25 февраля 2011

Как насчет отслеживания изменений в папке и порождения потока / файла, при условии, что уведомление об изменении дает вам список изменений в папке?

0 голосов
/ 25 февраля 2011

Аналогично предложению @ SimonC, но вместо очень длинного комментария у меня есть ответ.

final FilePoller poller = ...
final FileProcessor processor = ...

final ExecutorService executor = Executors.newFixedThreadPool(4);

executor.submit(new Runnable() { 
    public void run() {
        final File file = poller.pollForFile();
        executor.submit(new Runnable() { public void run() { processor.processFile(file); } } );
        // repeat, but wait for a free thread.
        executor.submit(this);
    }
  });
 // to stop the whole thing
 executor.shutdown();
0 голосов
/ 25 февраля 2011

Не используйте список;вместо этого используйте java.util.concurrent.ThreadPoolExecutor и просто удалите Runnable, представляющий файл, который должен быть обработан, в исполнителя, вместо помещения их в ваш глобальный список.

...