前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程编程学习十(线程池原理).

多线程编程学习十(线程池原理).

作者头像
JMCui
发布2019-09-23 15:43:05
3110
发布2019-09-23 15:43:05
举报
文章被收录于专栏:JMCui

一、线程池工作流程

  1. 线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务(需要获得全局锁)。如果核心线程池里的线程都在执行任务,则进入下个流程。
  2. 线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
  3. 线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务(需要获得全局锁)。如果已经满了,则交给饱和策略(例如抛出异常)来处理这个任务。

tips:这样的设计方案,可以避免频繁的线程创建,大部分的工作任务都会停留在第二步。

二、Executor 框架

在 Java 中,线程池的知识是要从 Executor 框架展开。Executor 框架主要由三部分组成:

1. 任务

包括 Runnable 接口或 Callable 接口。Runnable 接口无返回值,Callable 有返回值。

代码语言:javascript
复制
// Runnable 和 Callable 都可以直接被 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 执行
Runnable runnable = () -> System.out.println(123);
// Executors 可以将 Runnable 转化成 Callable
Callable<Object> callable = Executors.callable(runnable);
Callable<String> success = Executors.callable(runnable, "success");

2. 任务的执行

包括任务执行机制的核心接口 Executor、继承自 Executor 的 ExecutorService 接口以及实现 ExecutorService 的 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor。

ThreadPoolExecutor 是线程池的核心实现类,用来执行被提交的任务。其中 ThreadPoolExecutor 的原理就是上面介绍的线程池工作流程。

ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor ,可以在给定的延迟后执行任务,或者定期执行任务。

Executors 是创建 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 的工厂类。

代码语言:javascript
复制
static ExecutorService executorService = Executors.newFixedThreadPool(5);

3. 异步计算的结果

包括 Future 接口以及实现 Future 的 FutureTask 类。

代码语言:javascript
复制
// 执行 Runnable
executorService.execute(runnable);
// 执行 Callable
Future<Object> submit = executorService.submit(callable);
// Future 的 get 方法会阻塞线程直到完成
System.out.println(submit.get());
Future<String> future = executorService.submit(success);
System.out.println(future.get());

Executor 线程池的使用大抵如下,首先,我们需要创建 Runnable 或者 Callable 任务。然后通过 ThreadPoolExecutor.execute() 或者 ThreadPoolExecutor.submit() 把任务交给 ThreadPoolExecutor 容器执行。由 submit 提交的任务会返回 Future,表示线程执行的结果,其中 Future 的 get 方法会阻塞线程直到完成。

Executor框架的使用示意图如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、线程池工作流程
  • 二、Executor 框架
    • 1. 任务
      • 2. 任务的执行
        • 3. 异步计算的结果
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档