Java線程池是JDK1.5引入的,可以復(fù)用已創(chuàng)建的線程,減少創(chuàng)建和銷毀線程所帶來的開銷。線程池可以有效地控制并發(fā)線程的數(shù)量,提高系統(tǒng)性能。以下是Java線程池的使用方法和技巧:
創(chuàng)建線程池:
ExecutorService executor = Executors.newFixedThreadPool(int nThreads);
其中,nThreads
表示線程池中的線程數(shù)目。
提交任務(wù):
executor.execute(Runnable task);
其中,Runnable task
表示要執(zhí)行的任務(wù)。
關(guān)閉線程池:
executor.shutdown();
shutdown()
方法不會立即關(guān)閉線程池,而是不再接受新的任務(wù),等待已提交的任務(wù)執(zhí)行完畢后再關(guān)閉線程池。
shutdownNow()
方法會立即關(guān)閉線程池,并嘗試停止正在執(zhí)行的任務(wù)。
當線程池?zé)o法接受新任務(wù)時,會采取默認的拒絕策略,即拋出RejectedExecutionException
異常??梢酝ㄟ^重寫RejectedExecutionHandler
接口來自定義拒絕策略。
線程池中的線程數(shù)量可以通過構(gòu)造方法參數(shù)進行設(shè)置。如果設(shè)置為0,則表示不創(chuàng)建線程池,而是使用系統(tǒng)默認的線程池。如果設(shè)置為-1,則表示使用CPU核心數(shù)作為線程池中的線程數(shù)量。
線程池中的任務(wù)隊列用于存儲待執(zhí)行的任務(wù)??梢酝ㄟ^構(gòu)造方法參數(shù)指定任務(wù)隊列的類型和容量。如果未指定,則使用無界任務(wù)隊列。
線程池中的任務(wù)執(zhí)行順序是不確定的,因為線程池中的線程是并發(fā)執(zhí)行的。如果需要控制任務(wù)執(zhí)行順序,可以考慮使用有序的任務(wù)隊列或者使用PriorityBlockingQueue
作為任務(wù)隊列。
可以通過ThreadPoolExecutor
類提供的getActiveCount()
、getCompletedTaskCount()
、getTaskCount()
等方法來監(jiān)控線程池的狀態(tài)。還可以通過Future
對象來獲取任務(wù)執(zhí)行結(jié)果。
ExecutorService
接口不支持Callable
接口,如果需要使用Callable
接口,可以使用Executors.callable(Callable task)
方法將Callable
任務(wù)轉(zhuǎn)換為Runnable
任務(wù),然后提交給線程池執(zhí)行。
ForkJoinPool
是Java 7引入的一種特殊的線程池,用于實現(xiàn)分治算法。它采用工作竊取算法來平衡任務(wù)負載,提高任務(wù)執(zhí)行效率。ForkJoinPool
中的任務(wù)必須是RecursiveAction
或RecursiveTask
的子類。