线程池工厂方法newFixedThreadPool()和newCachedThreadPool()
newFixedThreadPool()方法:
该方法返回一个固定数量的线程池,当一个新的任务提交时,线程池中若有空闲线程,则立即执行。
若没有。则新的任务被暂存在一个任务队列中,待线程空闲时,便处理在任务队列中的任务
newCachedThreadPool()方法:
该方法返回一个可根据实际情况调整线程数量的线程池。若多余一个任务的线程数量不确定,但若有空闲线程可以复用
则会优先使用可复用的线程。若所有任务均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池复用。
下面看一个实例
package com.thread.test.ThreadPool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolDemo { public static class MyTask implements Runnable { public void run() { System.out.println(System.currentTimeMillis() + ":Thread ID:" + Thread.currentThread().getId()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { MyTask myTask = new MyTask(); ExecutorService exec = Executors.newFixedThreadPool(5);// 创建有5个线程的线程池 // ExecutorService exec = Executors.newCachedThreadPool();// 创建一个可根据实际情况调整线程数量线程池 for (int i = 0; i < 10; i++) { exec.submit(myTask); } } }
如果用newFixedThreadPool(),则输出如下结果:
1516775320357:Thread ID:10 1516775320357:Thread ID:13 1516775320357:Thread ID:12 1516775320357:Thread ID:11 1516775320357:Thread ID:14 1516775321357:Thread ID:14 1516775321357:Thread ID:11 1516775321357:Thread ID:13 1516775321357:Thread ID:12 1516775321357:Thread ID:10
这10个线程的执行情况如下:
前五个线程和后五个线程时间间隔为1s,并且前五个线程和后五个线程是完全一样的(看线程ID)
如果用newCachedThreadPool(),则输出结果如下:
1516775501829:Thread ID:11 1516775501830:Thread ID:13 1516775501829:Thread ID:10 1516775501830:Thread ID:14 1516775501829:Thread ID:12 1516775501830:Thread ID:16 1516775501830:Thread ID:15 1516775501830:Thread ID:18 1516775501830:Thread ID:17 1516775501830:Thread ID:19
劈天造陆,开辟属于自己的天地!!!与君共勉