ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java线程池

2021-02-28 14:35:55  阅读:145  来源: 互联网

标签:Java 队列 创建 接口 任务 线程 ThreadPoolExecutor


利用Executors创建不同的线程池满足不同场景的需求

线程池的创建方式: Java基础二、多线程

 

1、Fork/Join框架

把大任务分割成若干小任务并行执行,最终汇总每个小任务结果后得到大任务结果的框架。

 

 

 2、Work-Stealing算法: 某个线程从其他队列里窃取任务来执行。

当某个线程闲置后,可以窃取其它线程池的任务来执行。

 

3、为什么要使用线程池

1) 降低资源的消耗。 (利用重复利用已经创建的线程,以降低线程创建和销毁造成的消耗)

2) 提高线程的可管理性

 

4、Executor框架

 

 J.U.C的三个Executor接口

1) Executor接口 运行新任务的简单接口,将任务提交和任务执行细节解耦。

2) ExecutorService接口: 具备管理执行器和任务生命周期的方法,提交任务机制更完善。

   subbit方法<T> Future<T> submit(Callable<T> task);

 3) ScheduledExecutorService接口  支持Future和定期执行任务

4) ThreadPoolExecutor类

 

 WorkQueue工作队列: 可以是LinkedBlockingQueue,SynchronousQueue等。

 5) ThreadPoolExecutor类

里面有一个Worker类,实现了Runnable接口

 

 构造函数中this.thread = getThreadFactory().newThread(this);

使用ThreadFactory创建线程。

 

ThreadPoolExecutor的构造函数

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

corePoolSize: 核心线程数量 

maximumPoolSize: 线程不够用时能够创建的最大线程数

workQueue: 任务等待队列

keepAliveTime: 线程池维护空闲线程的时间,超过等待时间,空闲线程被销毁。

threadFactory:创建新线程,Executors.defaultThreadFactory() 

handler: 线程池的饱和策略 

  AbortPolicy: 直接抛出异常,这是默认策略

  CallerRunsPolicy: 用调用者所在的线程来执任务

  DiscardOldestPloicy: 丢弃队列中靠最前的任务,并执行当前任务。

  DiscardPolicy: 直接丢弃任务

       实现RejectedExecutionHandler接口的自定义handler

 

新任务提交execute执行后的判断

 

 流程图如下:

 

 

线程池线程数量的存储

ThreadPoolExecutor类的ctl 变量

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

 

线程池的状态

RUNNING: 能接受新提交的任务,并且也能处理阻塞队列中的任务。

SHUTDOWN: 不再接受新提交的任务,但可以处理存量任务。

STOP:  不再接受新提交的任务,也不处理存量任务。

TIDYING: 所有的任务都已终止。

TERMINATED: terminated()方法执行完后进入该状态。

线程池的状态转换图

 

 

工作线程的生命周期

 

线程池的大小如何选定

CPU密集型: 线程数=按照核数或者 核数+1设定

I/O密集型: 线程数= CUP核数 * (1 + 平均等待时间/平均工作时间)

标签:Java,队列,创建,接口,任务,线程,ThreadPoolExecutor
来源: https://www.cnblogs.com/linlf03/p/12168847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有