手记

必须要理清的Java线程池(原创)

本文已独家授权 鸿洋( hongyangAndroid ) 公众号发布!

前言:

    本篇文章主要介绍的是Java(Javaee和Android开发都会涉及)中的线程池。线程池不仅是Java多线程编程的重要基础,而且也是Android面试和Javaee面试中,面试官心血来潮突然向你发难的一道面试题(可能他自己也说不清楚道不明白线程池的概念和应用场景,但他们就是想见你一脸尴尬的表情以此作为压低你工资的筹码)。说到线程池之前,我们首先必须理清楚 线程、并行和并发、多线程的基本概念。

    线程池的概念大致理清楚之后,我们在分析OkHttp这一经典网络框架内部的线程池是如何实现的,通过分析源码进一步加深线程池概念。文章一如既往原来的风格,篇幅较长但力争写得详细明白。笔者从开始写到发布花了自己近一周的业余时间。(已对部分内容已进行了删减,初版达到了万字)个人希望看到这篇文章的开发者可以耐心、仔细、慢慢的看完,分段阅读也是较好的选择。

    所谓:九层之台、起于垒土

    另外对本文有任何意见或者觉得文章内容有所不足请在评论区直接提出issue,谢谢。

线程:

      说起线程,大家可能都不陌生。线程,是程序执行的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。以上概念来自于百度百科。对于开发者来说,线程就是帮我们干实事的伙伴。在Java中,对于线程的基本操作,我们知道在代码中有以下三种写法:

(1)自定义一个类,去继承Thread类,重写run方法

(2)自定义一个类,去实现Runnable接口,重写run方法

(3)自定义一个类,实现Callable接口,重写call方法。关于这个Callable,要多提一嘴,首先,Callable规定的方法是call(),而Runnable规定的方法是run().;其次,Callable的任务执行后可返回值,而Runnable的任务是不能返回值的;然后,call()方法可抛出异常,而run()方法是不能抛出异常的;最后,运行Callable任务可拿到一个Future对象。


实现Callable接口

因为线程的基本概念和使用大家基本上都很熟悉,所以这里就点到为止。

关于线程,就不得不提及另外一个经常容易被混淆的概念,那就是并行和并发。

关于并行和并发,我在网上找了一段关于并行和并发的英文资料:

Concurrency is when two tasks can start, run, and complete in overlapping time periods. Parallelism is when tasks literally run at the same time, eg. on a multi-core processor.

Concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations.

Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.

An application can be concurrent – but not parallel, which means that it processes more than one task at the same time, but no two tasks are executing at same time instant.

An application can be parallel – but not concurrent, which means that it processes multiple sub-tasks of a task in multi-core CPU at same time.

An application can be neither parallel – nor concurrent, which means that it processes all tasks one at a time, sequentially.

An application can be both parallel – and concurrent, which means that it processes multiple tasks concurrently in multi-core CPU at same time.


翻译过来就是:

并发是两个任务可以在重叠的时间段内启动,运行和完成。

并行是任务在同一时间运行,例如,在多核处理器上。

并发是独立执行过程的组合,而并行是同时执行(可能相关的)计算。

并发是一次处理很多事情,并行是同时做很多事情。

应用程序可以是并发的,但不是并行的,这意味着它可以同时处理多个任务,但是没有两个任务在同一时刻执行。

应用程序可以是并行的,但不是并发的,这意味着它同时处理多核CPU中的任务的多个子任务。

一个应用程序可以即不是并行的,也不是并发的,这意味着它一次一个地处理所有任务。

应用程序可以即是并行的也是并发的,这意味着它同时在多核CPU中同时处理多个任务。

    看完了这些,可能还是懵懵懂懂。为了彻底理清并行和并发的概念,我找了两幅不错的资料图来帮助我们巩固理解区分并行和并发。

首先是并发:



作者:骑小猪看流星
链接:https://www.jianshu.com/p/50fffbf21b39


0人推荐
随时随地看视频
慕课网APP