• 线程并发库


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

  • 相关阅读:
    什么是线程组,为什么在 Java 中不推荐使用?
    什么是 FutureTask?使用 ExecutorService 启动任务?
    Java 中用到的线程调度算法是什么?
    什么是阻塞队列?阻塞队列的实现原理是什么?如何使用 阻塞队列来实现生产者-消费者模型?
    说说对 SQL 语句优化有哪些方法?(选择几条)
    什么是 Executors 框架?
    Java Concurrency API 中的 Lock 接口(Lock interface) 是什么?对比同步它有什么优势?
    什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?
    Java 中你怎样唤醒一个阻塞的线程?
    你将如何使用 thread dump?你将如何分析 Thread dump?
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11311291.html
Copyright © 2020-2023  润新知