线程并发库

从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.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能

原文地址:https://www.cnblogs.com/gxlaqj/p/11311291.html