美文网首页
JUC-ThreadPool

JUC-ThreadPool

作者: GIT提交不上 | 来源:发表于2020-03-06 16:24 被阅读0次

  线程池:控制运行的线程数量,底层是阻塞队列。

  • 线程复用(降低资源损耗)
  • 控制最大并发数(提高响应速度)
  • 管理线程(提高线程的可管理性)

  线程池示例代码如下所示:

/**
 * @author luffy
 **/
public class ThreadPoolDemo {
    public static void main(String[] args){
//        System.out.println(Runtime.getRuntime().availableProcessors());
//        ExecutorService service = Executors.newFixedThreadPool(5);
//        ExecutorService service = Executors.newSingleThreadExecutor();
        ExecutorService service = Executors.newCachedThreadPool();
        try {
            for (int i = 0; i < 10; i++) {
                service.execute(()->{
                    System.out.println(Thread.currentThread().getName()+":处理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            service.shutdown();
        }
    }
}

  常用线程池如下:

  • Executors.newCacheThreadPool()
  • Executors.newFixedThreadPool(int n)
  • Executors.newSingleThreadExecutor()

   ThreadPoolExecutor类结构图如下所示:

图1-1 ThreadPoolExecutor类结构图.png

  线程池ThreadPoolExecutor构造方法7大参数:

   public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
  • corePoolSize-线程池核心线程数最大值
  • maximumPoolSize-线程池线程总数最大值(核心线程+非核心线程)
  • keepAliveTime-非核心线程闲置超时时长(多余空闲线程存活时间)
  • unit-时间单位
  • workQueue-线程池任务队列
  • threadFactory-创建线程方式,默认
  • handler-拒绝处理策略(4种)

  拒绝处理策略如下:

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出-RejectedExecutionException异常。 (默认)
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

  线程池任务执行过程如下所示:

图1-2 线程池任务执行过程.png

  线程池状态转化图如下所示:

图1-3 线程池状态转换图.png 图1-4 keepAliveTime源码使用图.png

  手写线程池示例代码如下所示:

/**
 * @author luffy
 **/
public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService service = new ThreadPoolExecutor(
                5,
                10,
                2L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardPolicy());
        // new ThreadPoolExecutor.AbortPolicy()
        // new ThreadPoolExecutor.CallerRunsPolicy()
        // new ThreadPoolExecutor.DiscardOldestPolicy()
        // new ThreadPoolExecutor.DiscardPolicy()
        try {
            for (int i = 0; i < 30; i++) {
                service.execute(()->{
                    System.out.println(Thread.currentThread().getName()+":银行柜台处理业务!");
                });
            }

        }finally {
            service.shutdown();
        }
    }
}

  线程池参数配置:

  • CPU密集型:任务需要大量的计算,没有阻塞,CPU一致全速运行;公式:CPU核数+1个线程的线程池。
  • I/O密集型:公式:2*CPU核数;公式:CPU核数/(1-阻塞系数),阻塞系数在0.8~0.9之间。
//获取PCU核数
Runtime.getRuntime().availableProcessors()

  进一步研究CompletionService:

CompletionService解析

相关文章

  • JUC-ThreadPool

      线程池:控制运行的线程数量,底层是阻塞队列。 线程复用(降低资源损耗) 控制最大并发数(提高响应速度) 管理线...

网友评论

      本文标题:JUC-ThreadPool

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