线程池创建及参数设置

一、创建线程池以及线程池的各种参数分析:

 //不指定最大线程数,默认是Int的最大值
    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.submit(() -> {
        System.out.println("新建线程池对象,执行第一个默认线程");
    });
    executorService.shutdown();


    //指定最大线程数
    ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);
    newFixedThreadPool.submit(() -> {
        System.out.println("新建线程池对象,执行第二个默认线程,指定最大线程数");
    });
    newFixedThreadPool.shutdown();

    
    //前2个都是创建的ThreadPoolExecutor线程池对象并返回,也可以直接创建线程池对象,7个参数分别为:
    /**
     * 1、corePoolSize:核心线程数,当线程池创建时就会创建,不会回收,直到线程池销毁
     * 2、maximumPoolSize:线程池最大线程数,当maximumPoolSize-corePoolSize=临时线程,当临时线程超过keepAliveTime的时间没使用时会销毁
     * 3、keepAliveTime:临时线程保持的最长时间的值,
     * 4、unit:临时线程保持的最长时间的时间单位,比如keepAliveTime=60,unit=秒,则临时线程超过60秒未使用则会销毁
     * 5、workQueue:当线程池所有的线程都处于非空闲状态时,又有新的任务提交则会放入阻塞队列中等待执行,一般用ArrayBlockingQueue(指定队列的容量),数组类型的阻塞队列
     * 6、threadFactory:创建线程的方法工厂,通过哪个工厂来创建线程,一般是按照默认的方式创建线程,比如new Thread()
     * 7、handler:任务的拒绝策略:a、什么时候触发任务拒绝?当所有线程处于非空闲状态,且阻塞队列的容量也已经满了的情况下,会触发任务拒绝策略
     *                         b、如何拒绝?有4种任务拒绝策略:
     *                                                   拒绝并抛出异常(默认);
     *                                                   拒绝但并不抛出异常(不推荐);
     *                                                   抛弃阻塞队列中等待最久的队列,并将当前队列加入
     *                                                   直接调用任务的run()方法执行线程,绕过线程池,直接执行run()
     * */
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,
            5,
            60,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(3),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy());
    threadPoolExecutor.submit(() -> {

    });

二、在JVM中,线程与线程之间的数据共享问题:

你可能感兴趣的:(java,开发语言,后端)