十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
下面通過實例代碼為大家介紹Java線程池的幾種實現(xiàn)方法和區(qū)別:
import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class TestThreadPool { // -newFixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的線程 // -其獨特之處:任意時間點,最多只能有固定數(shù)目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子 // -和cacheThreadPool不同,F(xiàn)ixedThreadPool沒有IDLE機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的TCP或UDP // IDLE機制之類的),所以FixedThreadPool多數(shù)針對一些很穩(wěn)定很固定的正規(guī)并發(fā)線程,多用于服務器 // -從方法的源代碼看,cache池和fixed 池調用的是同一個底層池,只不過參數(shù)不同: // fixed池線程數(shù)固定,并且是0秒IDLE(無IDLE) // cache池線程數(shù)支持0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE private static ExecutorService fixedService = Executors.newFixedThreadPool(6); // -緩存型池子,先查看池中有沒有以前建立的線程,如果有,就reuse.如果沒有,就建一個新的線程加入池中 // -緩存型池子通常用于執(zhí)行一些生存期很短的異步型任務 // 因此在一些面向連接的daemon型SERVER中用得不多。 // -能reuse的線程,必須是timeout IDLE內(nèi)的池中線程,缺省timeout是60s,超過這個IDLE時長,線程實例將被終止及移出池。 // 注意,放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。 private static ExecutorService cacheService = Executors.newCachedThreadPool(); // -單例線程,任意時間池中只能有一個線程 // -用的是和cache池和fixed池相同的底層池,但線程數(shù)目是1-1,0秒IDLE(無IDLE) private static ExecutorService singleService = Executors.newSingleThreadExecutor(); // -調度型線程池 // -這個池子里的線程可以按schedule依次delay執(zhí)行,或周期執(zhí)行 private static ExecutorService scheduledService = Executors.newScheduledThreadPool(10); public static void main(String[] args) { DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ListcustomerList = new ArrayList (); System.out.println(format.format(new Date())); testFixedThreadPool(fixedService, customerList); System.out.println("--------------------------"); testFixedThreadPool(fixedService, customerList); fixedService.shutdown(); System.out.println(fixedService.isShutdown()); System.out.println("----------------------------------------------------"); testCacheThreadPool(cacheService, customerList); System.out.println("----------------------------------------------------"); testCacheThreadPool(cacheService, customerList); cacheService.shutdownNow(); System.out.println("----------------------------------------------------"); testSingleServiceThreadPool(singleService, customerList); testSingleServiceThreadPool(singleService, customerList); singleService.shutdown(); System.out.println("----------------------------------------------------"); testScheduledServiceThreadPool(scheduledService, customerList); testScheduledServiceThreadPool(scheduledService, customerList); scheduledService.shutdown(); } public static void testScheduledServiceThreadPool(ExecutorService service, List customerList) { List > listCallable = new ArrayList >(); for (int i = 0; i < 10; i++) { Callable callable = new Callable () { @Override public Integer call() throws Exception { return new Random().nextInt(10); } }; listCallable.add(callable); } try { List > listFuture = service.invokeAll(listCallable); for (Future future : listFuture) { Integer id = future.get(); customerList.add(id); } } catch (Exception e) { e.printStackTrace(); } System.out.println(customerList.toString()); } public static void testSingleServiceThreadPool(ExecutorService service, List customerList) { List >> listCallable = new ArrayList >>(); for (int i = 0; i < 10; i++) { Callable > callable = new Callable
>() { @Override public List
call() throws Exception { List list = getList(new Random().nextInt(10)); boolean isStop = false; while (list.size() > 0 && !isStop) { System.out.println(Thread.currentThread().getId() + " -- sleep:1000"); isStop = true; } return list; } }; listCallable.add(callable); } try { List >> listFuture = service.invokeAll(listCallable); for (Future > future : listFuture) { List
list = future.get(); customerList.addAll(list); } } catch (Exception e) { e.printStackTrace(); } System.out.println(customerList.toString()); } public static void testCacheThreadPool(ExecutorService service, List customerList) { List >> listCallable = new ArrayList >>(); for (int i = 0; i < 10; i++) { Callable > callable = new Callable
>() { @Override public List
call() throws Exception { List list = getList(new Random().nextInt(10)); boolean isStop = false; while (list.size() > 0 && !isStop) { System.out.println(Thread.currentThread().getId() + " -- sleep:1000"); isStop = true; } return list; } }; listCallable.add(callable); } try { List >> listFuture = service.invokeAll(listCallable); for (Future > future : listFuture) { List
list = future.get(); customerList.addAll(list); } } catch (Exception e) { e.printStackTrace(); } System.out.println(customerList.toString()); } public static void testFixedThreadPool(ExecutorService service, List customerList) { List >> listCallable = new ArrayList >>(); for (int i = 0; i < 10; i++) { Callable > callable = new Callable
>() { @Override public List
call() throws Exception { List list = getList(new Random().nextInt(10)); boolean isStop = false; while (list.size() > 0 && !isStop) { System.out.println(Thread.currentThread().getId() + " -- sleep:1000"); isStop = true; } return list; } }; listCallable.add(callable); } try { List >> listFuture = service.invokeAll(listCallable); for (Future > future : listFuture) { List
list = future.get(); customerList.addAll(list); } } catch (Exception e) { e.printStackTrace(); } System.out.println(customerList.toString()); } public static List getList(int x) { List list = new ArrayList (); list.add(x); list.add(x * x); return list; } }