1、降低系统资源消耗,提高系统响应速度。
当有任务到达时,通过复用已存在的线程,降低线程创建和销毁造成的消耗且无需等待新线程的创建便能立即执行任务。
例如:设创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3。如果T1+T3>T2,那么每次执行任务都开启一个线程来执行太不划算了,如果使用线程池,我们就可以节省T1+T3的时间,直接进入T2执行任务阶段。下方代码用实际效果说明T1+T3>T2(这个不是绝对的,T2的时长根据实际任务决定)。
public class Test { public static void main(String[] args) { long start, end; long t1, t2, t3; Thread t; //创建线程时间 start = System.nanoTime(); t = new Thread(new Runnable() { @Override public void run() { } }); end = System.nanoTime(); t1 = end - start; System.out.println("创建线程耗时t1:" + t1); //执行任务时间 start = System.nanoTime(); t.start(); end = System.nanoTime(); //等待线程执行完毕 while (Thread.activeCount() != 1) { } t2 = end - start; System.out.println("执行任务耗时t2:" + t2); //销毁线程时间 start = System.nanoTime(); t.interrupt(); end = System.nanoTime(); t3 = end - start; System.out.println("销毁线程耗时t3:" + t3); if (t1 + t3 > t2) { System.out.println("t1 + t3 > t2"); } } }
2、便于有效控制线程并发数,避免并发数量过多导致系统资源不足产生阻塞。
系统资源是有限的,如果线程不进行管控,在内存上可能会导致OOM内存溢出问题,在CPU调度上会导致过度切换影响系统响应效率(CPU切换线程是有时间成本的,需要保持当前执行线程的现场,并恢复要执行线程的现场)。
3、提供更强大的功能,如延时定时线程池等。
线程池的使用参考:线程池的创建及使用