线程池

作者: 磊_5d71 | 来源:发表于2018-11-04 14:49 被阅读0次

    new Thread() 弊端

    • 每次 new Thread()新建对象,性能差。
    • 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机(CPU利用率过高)或OOM。
    • 缺少更多功能:更多执行、定期执行、线程中断。

    线程池的好处

    • 重用存在的线程,减少对象创建、消亡的开销,性能佳
    • 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞。
    • 提供定时执行、定期执行、单线程、并发数控制等功能

    线程池-ThreadPoolExecutor

    图片.png
    图片.png

    线程池运行流程

    图片.png
    • 执行shutdown() 后不接受新的任务,但可以继续处理阻塞队列中保存的任务。
    • 执行shotdownNow() 不接受新的任务,也不处理阻塞队列中的任务。

    常用方法

    图片.png
    图片.png

    线程池类图

    图片.png

    Executor框架接口

    图片.png
    • newCachedThreadPool
    package com.alan.concurrency.example.threadPool;
    
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    
    @Slf4j
    public class ThreadPoolExample1 {
    
    
        public static void main(String[] args) {
    
            ExecutorService executorService = Executors.newCachedThreadPool();
    
            for (int i = 0; i < 10; i++) {
                final int index = i;
                executorService.execute(new Runnable() {
                    @Override
                    public  void run() {
                        log.info("task:{}",index);
                    }
                });
            }
    
            executorService.shutdown();
        }
    }
    
    • newFixedThreadPool
    package com.alan.concurrency.example.threadPool;
    
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    @Slf4j
    public class ThreadPoolExample2 {
    
    
        public static void main(String[] args) {
    
            ExecutorService executorService = Executors.newFixedThreadPool(3);
    
            for (int i = 0; i < 10; i++) {
                final int index = i;
                executorService.execute(new Runnable() {
                    @Override
                    public  void run() {
                        log.info("task:{}",index);
                    }
                });
            }
    
            executorService.shutdown();
        }
    }
    
    • newSingleThreadExecutor
    package com.alan.concurrency.example.threadPool;
    
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    @Slf4j
    public class ThreadPoolExample3 {
    
    
        public static void main(String[] args) {
    
            //用一个线程就是按顺序执行下来的
            ExecutorService executorService = Executors.newSingleThreadExecutor();
    
            for (int i = 0; i < 10; i++) {
                final int index = i;
                executorService.execute(new Runnable() {
                    @Override
                    public  void run() {
                        log.info("task:{}",index);
                    }
                });
            }
    
            executorService.shutdown();
        }
    }
    

    线程池配置

    图片.png

    J.U.C整体导图

    图片.png

    相关文章

      网友评论

          本文标题:线程池

          本文链接:https://www.haomeiwen.com/subject/nudrxqtx.html