使用Executors工廠類的newCachedThreadPool方法來創(chuàng)建的線程執(zhí)行器痢畜,當(dāng)執(zhí)行器碰到?jīng)]有可用線程的時(shí)候,執(zhí)行器就會創(chuàng)建新的線程安接。這樣趟径,當(dāng)大量的任務(wù)加入到線程執(zhí)行器,就會造成系統(tǒng)超負(fù)荷運(yùn)行卓研。
為了解決這個(gè)問題趴俘,我們這次試用一個(gè)固定大小的線程執(zhí)行器。這個(gè)執(zhí)行器有一個(gè)線程數(shù)的最大值奏赘。如果新任務(wù)進(jìn)來后已經(jīng)沒有可用線程寥闪,那么新的任務(wù)都將會被阻塞,直到有任務(wù)執(zhí)行完畢磨淌,這時(shí)執(zhí)行器才有可用線程來執(zhí)行被組賽的任務(wù)疲憋。
要想創(chuàng)建固定大小線程執(zhí)行器,你需要使用執(zhí)行器工廠的Executors.newFixedThreadPool(n)來創(chuàng)建梁只,參數(shù)n為最大線程數(shù)缚柳。
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* Created by hadoop on 15/12/9.
*/
public class Server {
ThreadPoolExecutor executor;
public Server() {
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
}
public void execute(Task task) {
System.out.println("Server: A new task has arrived.\n");
executor.execute(task);
System.out.printf("Server: Pool Size: %d\n", executor.getPoolSize());
System.out.printf("Server: Active Count: %d\n", executor.getActiveCount());
System.out.printf("Server: Completed Task: %d\n", executor.getCompletedTaskCount());
System.out.printf("Server: Task Count: %d\n", executor.getTaskCount());
}
public void endServer() {
executor.shutdown();
}
}
其他代碼(Main和Task類)埃脏,參考Java并發(fā)編程高級篇(一)。