public class MyTask implements Runnable {private int taskNum;public MyTask(int num) {this.taskNum = num;}@Overridepublic void run() {System.out.println("正在執行task " + taskNum);try {Thread.currentThread().sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("task " + taskNum + "執行完畢");}}
上面的程序很簡單,就只是去打印一些簡單的信息。
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("線程池中線程數目:" + executor.getPoolSize()+ ",隊列中等待執行的任務數目:" + executor.getQueue().size()+ ",已執行完別的任務數目:" + executor.getCompletedTaskCount());}
}
上面用到了java為我們提供的類ThreadPoolExecutor,這是一個很好的類。上面用到創建實例時用到的構造器如下:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}
它包含了下面這只個參數:
? int corePoolSize:線程池中線程數 ? int maximumPoolSize:線程池中最大的線程數 ? long keepAliveTime:表示線程沒有任務執行時最多保持多久時間會終止 ? TimeUnit unit:參數keepAliveTime的時間單位,在TimeUnit類中有7種靜態屬性: