从JDK1.5开始有的并发库,给JAVA线程的管理和使用提供了强大的便利性。
java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变得得心应手,
该包提供了线程的运行,线程池的创建,线程生命周期的控制。
java通过Executors提供了四种静态方法创建线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任务,当整个线程池都处于闲置状态时,线程池中的线程都会超时被停止。
public class Demo002 { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i=0;i<7;i++){ final int index = i; try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } executorService.execute(new Runnable() { @Override public void run() { System.out.println("第" +index +"个线程" +Thread.currentThread().getName()); } }); } } }
输出结果为:
第0个线程pool-1-thread-1
第1个线程pool-1-thread-1
第2个线程pool-1-thread-1
第3个线程pool-1-thread-1
第4个线程pool-1-thread-1
第5个线程pool-1-thread-1
第6个线程pool-1-thread-1
从结果可以看到,执行第二个任务的时候第一个任务已经完成,会复用执行第一个任务的线程,不用每次新建线程。
newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
/**使用静态方法创建一个定长线程池*/ ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i=0;i<7;i++){ final int index=i; executorService.execute(new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("第" +index +"个线程" +Thread.currentThread().getName()+" : "+System.currentTimeMillis()); } }); }
输出结果为:
第4个线程pool-1-thread-5 : 1565092551636
第1个线程pool-1-thread-2 : 1565092551636
第3个线程pool-1-thread-4 : 1565092551636
第2个线程pool-1-thread-3 : 1565092551636
第0个线程pool-1-thread-1 : 1565092551636
第6个线程pool-1-thread-2 : 1565092553639
第5个线程pool-1-thread-5 : 1565092553639
由于设置最大线程是5,所以当执行完这5个线程后,等待两秒后,在执行后面2个线程
创建一个指定工作线程数量的线程池,每当提交一个任务就创建一个工作线程,当线程 处于空闲状态时,它们并不会被回收,除非线程池被关闭了,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列(没有大小限制)中。由于newFixedThreadPool只有核心线程并且这些核心线程不会被回收,这样它更加快速底相应外界的请求。
newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
new SingleThreadExcutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行
线程池的作用:
1.重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销
2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞
3.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能