По умолчанию, если вы отправляете более 4 задач в пул, дополнительные задания будут поставлены в очередь до тех пор, пока поток не станет доступен.
В блоге, на который вы ссылаетесь в своем комментарии, используется семафор, чтобы ограничить объем работы, который может быть поставлен в очередь сразу, что не будет проблемой для вас, пока у вас не будет много тысяч задач в очереди, и они начнут есть в доступная память. Есть более простой способ сделать это, в любом случае - построить ThreadPoolExecutor с ограниченной очередью. * Но это не ваша проблема.
Если вы хотите знать, когда завершает задачу, обратите внимание, что ExecutorService.submit()
возвращает Future
объект, который может быть использован, чтобы ждать завершения данных задачи:
Future<?> f = pool.execute(p);
f.get();
System.out.println("task complete");
Если у вас есть несколько задач, и хотите ждать все они должны заполнить, либо сохранить каждый Future
в списке, а затем позвонить по номеру get()
по очереди или исследовать ExecutorService.invokeAll()
(что по сути делает то же самое, но в одном вызове метода).
Вы также можете сказать, имеет ли задача завершена или нет:
Future<?> f = pool.execute(p);
while(!f.isDone()) {
// do something else, task not complete
}
f.get();
Наконец, следует отметить, что даже если ваши задачи будут выполнены, ваша программа не может выйти (и, таким образом, по-видимому, «зависание»), если вы не вызвали shutdown()
в пуле потоков; причина в том, что потоки все еще работают, ожидая, что им будет больше работы.
* Edit: извините, я просто перечитайте мой ответ и понял, что эта часть неверно - ThreadPoolExecutorпредлагает задачи в очереди и отвергает их, если они не будут приняты, поэтому ограниченная очередь имеет различную семантику к семафорному подходу.
Я думаю, что семафор существует, потому что нет другого способа блокировать, если все 4 потока заняты - исполнитель будет генерировать исключение, тогда как нам нужно его заблокировать подающий поток. – skaffman
Какие исключения вы видите, будучи брошенными? Новые задачи, которые вы отправляете, должны быть просто поставлены в очередь Исполнителем, если все потоки заняты. – nos
Эй, я прочитал этот блог и предположил, что мне нужно сделать ssemaphores. http://blog.readpath.com/2010/01/20/java-fixedthreadpool/ – 2010-11-13 20:26:21