java多线程-04-线程池

[TOC]

声明

该系列文章只是记录本人回顾java多线程编程时候记录的笔记。文中所用语言并非严谨的专业术语(太严谨的术语其实本人也不会……)。难免有理解偏差的地方,欢迎指正。
另外,大神请绕路。不喜勿喷。
毕竟好记性不如烂笔头嘛,而且许多东西只要不是你经常用的最终都会一丢丢一丢丢地给忘记。

1 线程池简介

1.2 什么是线程池?

通俗点讲,线程池就是一个装有一大堆线程的容器。
这就和我们通常使用的JDBC的各种数据源有点类似了。数据源里的元素是改造过可重复利用的数据库连接(Connection)的实例。而线程池里的元素就是可重复利用的线程了。

1.2 使用线程池有什么好处?

  • 降低开销: 主要是线程的创建和销毁的开销(提前创建)
  • 提高响应速度: 省去了线程的创建和销毁的阶段,能立即响应业务处理
  • 更好的管理线程: 线程池是线程的容器, 线程放在容器里更方便统一监控和管理

以下是《java并发编程的艺术》一书中对线程池工作流程的流程图

线程池的处理流程

2 ThreadPoolExecutor

2.1 相关属性

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    5, 10, 60, TimeUnit.SECONDS, 
    new ArrayBlockingQueue<>(100)
);
  • corePoolSize: 线程池基本大小
    • 将一个待执行的任务放到线程池中的时候,如果待执行的任务数小于该参数,线程池就会创建一个线程来执行该任务。反之,不再创建新的线程。
    • 在线程池刚刚创建后,线程并不是立即启动的。如果事先调用了prestartCoreThread()或者prestartAllCoreThreads()方法则会立即启动核心线程。
  • poolSize: 当前大小(实际线程数)
  • maximumPoolSize: 线程池中所能允许的最大线程数
    • 如果队列满了,并且poolSize < maximumPoolSize,在新任务到来后会创建新的线程来执行。
    • 如果底层使用的是无界队列,该参数将无意义
  • allowCoreThreadTimeOut: 是否允许核心线程超时退出
    • 在没有任务执行的时候,是否允许核心线程超时退出
    • false: 表示即使是空闲时,核心核心线程也不会退出
  • keepAliveTime: 是否允许线程超时退出
    • 此处指的是超出核心线程数的那部分线程(corePoolSize < poolSize < maximumPoolSize)
    • 而核心线程是否超时退出由allowCoreThreadTimeOut控制
  • workQueue | runnableTaskQueue : 用来保存待执行任务的阻塞队列
  • threadFactory: 创建线程的工厂
  • RejectedExecutionHandler: 饱和处理策略,见下文

2.2 饱和处理策略

如果使用的是有界队列,很可能出现队列和线程池饱和的情况,RejectedExecutionHandler就是用来指定如何处理这种情况的。

内置的四种实现如下:

  • AbortPolicy: 抛出异常
  • CallerRunsPolicy: 在调用execute()方法的线程里执行饱和的任务
  • DiscardOldestPolicy: discards the oldest unhandled request
    • 此处不知道怎么翻译了,oldest可以理解为最靠近队首的元素
    • 或者说是最近
  • DiscardPolicy: 直接丢弃

2.3 提交/执行任务

线程池创建好之后,下一步就是向线程池提交任务让线程池中的线程去执行。
提交的任务必须是Callable或者Runnable的实现类。

提交任务,有如下方法:

public void execute(Runnable command){}

public Future<?> submit(Runnable task){}
public <T> Future<T> submit(Callable<T> task){}
public <T> Future<T> submit(Runnable task, T result){}

其中,execute()方法用于提交没有返回值的任务。所以无法得知提交的任务什么时候被执行,也无法知道何时执行完毕了。

this.executor.execute(() -> {
    // task to executed
});

submit()方法用于提交带有返回值的任务。

Future<String> future = this.executor.submit(new Callable<String>() {

    @Override
    public String call() throws Exception {
        return null;
    }
});

try {
    String result = future.get();
    System.out.println(result);
} catch (InterruptedException e) {
    // 中断
    e.printStackTrace();
} catch (ExecutionException e) {
    // 任务执行错误
    e.printStackTrace();
} finally {
    this.executor.shutdown();
}

2.4 停止线程池

提供了两个方法来终止线程池: shutdown()shutdownNow()

shutdown
shutdownNow

这两个方法都是通过遍历线程,逐个调用线程的interrupt()方法来终止线程的。

interrupt

所以问题来了:

无法响应中断的线程,可能就没法终止了

另外,在shutdown()方法中,还调用了onShutdown方法。这个方法方法体的实现是空的。
可以重写这个hook方法来在线程池销毁的时候完成一些其他的事情。

参考资料

  • 《java并发编程的艺术》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容