public class MyTask implements Runnable {private int taskNum;public MyTask(int num) {this.taskNum = num;}@Overridepublic void run() {System.out.println("正在執(zhí)行task " + taskNum);try {Thread.currentThread().sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("task " + taskNum + "執(zhí)行完畢");}}
上面的程序很簡單,就只是去打印一些簡單的信息。
Executor.java
public class Executor {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5));for (int i = 0; i < 15; i++) {MyTask myTask = new MyTask(i);if (!executor.isShutdown()) {executor.execute(myTask);}printExecutor(executor);}executor.shutdown();}private static void printExecutor(ThreadPoolExecutor executor) {System.out.println("線程池中線程數(shù)目:" + executor.getPoolSize()+ ",隊(duì)列中等待執(zhí)行的任務(wù)數(shù)目:" + executor.getQueue().size()+ ",已執(zhí)行完別的任務(wù)數(shù)目:" + executor.getCompletedTaskCount());}
}
上面用到了java為我們提供的類ThreadPoolExecutor,這是一個(gè)很好的類。上面用到創(chuàng)建實(shí)例時(shí)用到的構(gòu)造器如下:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}
它包含了下面這只個(gè)參數(shù):
? int corePoolSize:線程池中線程數(shù) ? int maximumPoolSize:線程池中最大的線程數(shù) ? long keepAliveTime:表示線程沒有任務(wù)執(zhí)行時(shí)最多保持多久時(shí)間會(huì)終止 ? TimeUnit unit:參數(shù)keepAliveTime的時(shí)間單位,在TimeUnit類中有7種靜態(tài)屬性: