Java中的多線程編程需要了解核心線程和非核心線程的概念。在Java中,線程分為兩種類型:核心線程和非核心線程。
核心線程是指直接由Thread類或者ThreadPoolExecutor類創(chuàng)建的線程,這些線程通常執(zhí)行任務(wù)隊(duì)列中的任務(wù),并且不會(huì)被回收。當(dāng)任務(wù)隊(duì)列中沒有任務(wù)時(shí),核心線程會(huì)阻塞,等待新的任務(wù)產(chǎn)生。如果創(chuàng)建ThreadPoolExecutor時(shí)使用了ThreadPoolExecutor的預(yù)初始化機(jī)制,核心線程會(huì)一直存在,甚至在沒有任務(wù)時(shí)也不會(huì)被回收。
public class CoreThreadDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i< 10; i++) { executorService.execute(new Task()); } executorService.shutdown(); } } class Task implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + ": hello world"); } }
非核心線程也稱為輔助線程,這些線程是在任務(wù)隊(duì)列中等待任務(wù)時(shí)動(dòng)態(tài)創(chuàng)建的,當(dāng)任務(wù)隊(duì)列滿時(shí),會(huì)增加非核心線程來執(zhí)行任務(wù)。當(dāng)任務(wù)完成后,非核心線程會(huì)進(jìn)行回收或者保留一段時(shí)間,以備重用。如果非核心線程在指定時(shí)間內(nèi)沒有執(zhí)行新任務(wù),則會(huì)被回收。
public class NonCoreThreadDemo { public static void main(String[] args) { ExecutorService executorService = new ThreadPoolExecutor( 5, 10, 1L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(15), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); for (int i = 0; i< 20; i++) { executorService.execute(new Task()); } executorService.shutdown(); } }
在實(shí)際應(yīng)用中,根據(jù)任務(wù)類型和業(yè)務(wù)需求來合理分配核心線程數(shù)和非核心線程數(shù),以達(dá)到最優(yōu)的性能效果。