§68 Лучше executors and tasks, чем потоки
Executor framework - 1.5, java.util.concurrent –выключить (.shutdown() ) –ждать пока не выполнится один или все (.invoke() and.invokeAll()) –подождать пока все не закончат (.awaitTermination())
Executors.newSingleThreadExecutor – один поток Executors.newCachedThreadPool – порождает новый поток на каждую новую задачу Executors.newFixedThreadPool – содержит фиксированное кол-во потоков Executors.newScheduledThreadPool – позволяет выполнять отсроченные или периодические действия
Thread Executor (Runnable and Callable)
§69 Concurrency utilities
Сложность использования wait() and notify(), замещается простотой java.util.concurrency –Синхронизированные коллекции –Executor framework –Syncronizers
Нельзя выключить синхронизированность таких коллекций. Locks не будут иметь эффекта.
В 6 раз быстрее, чем предыдущая реализация
Countdown latch – класс барьеров, который позволяет одному или более потокам ждать пока один или более потоков не достигнут барьера и не вызовут countDown() Пример для измерения времени одновременного исполнения задач
Всегда используйте цикл снаружи wait(), и старайтесь избегать его использования без цикла. Причина: если условие уже выполнено, то нет никакой гарантии, что поток когда-либо проснется. И еще