文档章节

Java线程之核心概念

士别三日
 士别三日
发布于 06/04 16:59
字数 1459
阅读 9
收藏 0

1.线程的三个基本角色

线程是一个执行流程,它不是类,也不是对象。我们先来梳理一下线程的三个基本角色:

  1. Runnable接口:任务入口角色。Runnable的run方法跟主线程的main方法充当的角色一致;
  2. Thread类:线程管理角色。可以设置/获取this thread的属性,管理this thread的生命周期和监控干预current thread等功能;
  3. 锁:同步和协作角色。每个对象(Object)都是一把锁。结合synchronized原语和锁(Object)中的wait()/wait(long timeout)/    wait(long timeout, int nanos)/notify()/notifyAll()方法,起到协调多线程的作用。

Runnable和Thread不是一个概念的东西,一个是任务入口,一个是线程管理员。创建一个线程最佳的办法应该是先创建一个实现了Runnable接口的类,然后再把它注入Thread对象,而不是直接继承Thread对象。这样程序才看起来职责分明。

this thread是指由某个Thread对象管理的那个线程。current thread是指运行时的那个线程。我们平时可能很少注意这两者的区别,经常弄不清被操作者是this thread还是current thread(操作者总是current thread)。我这里做个总结:

  • 锁操作的对象永远是current thread;
  • Thread的静态方法操作的对象永远是current thread;
  • Thread的成员方法操作的对象永远是this thread;

举一个很经典的例子:interrupt()是一个成员方法,会让this thread中断;interrupted()是一个静态方法,作用是检测current thread是否是中断的;    isInterrupted()又是一个成员方法,作用是检测this thread是否是中断的。

当然,this thread可以转化为current thread。通过Thread类的静态方法currentThread(),就可以得到运行时线程的Thread对象,这个Thread对象调用成员方法的时候,操作的也是current Thread,因为这时this thread和current Thread是同一个线程。Thread.interrupted()和Thread.currentThread().isInterrupted()是等效的。

任何对象都可以是锁。锁的作用有两个:同步和协作。wait()/wait(long timeout)/    wait(long timeout, int nanos)/notify()/notifyAll()都是锁的方法,如果一个对象没有被当做锁,调用这些方法就会报错。synchronized可以让一个对象成为一把锁,起到同步的作用,而锁的这些方法可以协调需要这把锁的多个线程。

好了,现在梳理清楚了线程的三个基本角色,以及它们之间的关系。接下来总结一下多线程的两大用处。

 

2.线程的两大用处

多线程其实就两个用处,一是并行,二是并发。并行和并发的区别可以看下图。并行带来的好处显而易见,多一个咖啡机,我们就能早点喝到咖啡。并行就不一定了,排了两个队,只有一个咖啡机,在拿咖啡的时候两队最前面的两个人还要抢一下(线程同步开销),才能喝到咖啡,我们可能会因此更晚喝到咖啡。

但是并发其实好处也很多,比如除了消费者,还有咖啡供应者,假设每个咖啡机消费者一分钟能消费一杯咖啡,供应者十分钟才能做好一杯新鲜的咖啡放在咖啡机。那怎么办呢?那就每个咖啡机要十个以上供应者(算上同步开销的话),才能满足消费者的需求。

并行是多个线程在各自状态环境下运行。并发是多个线程在同一个状态环境下运行。并发通常需要引入同步机制,维护状态的一致性。

到底是选择并行还是并发,关键看线程之间需不需要共享状态数据,如果不需要,就选择并行。如果需要,就选择并发,并且想好同步机制。

 

3.线程的同步和协作细节(并发)

然后再看一下,并发线程之间是怎么同步和协作的,直接上图(这是《图解Java多线程模式》书中的图,图美盗之):

 

 

 

注意:

  1. 图中的等待队列只是一个虚拟模型,并不是锁对象里面真实的数据结构。
  2. 锁同步的对象不是行为(方法),而是行为访问的状态数据(成员变量)。如果要维护一个状态数据的一致性,就要把所有会访问它的方法同步起来。被同一把锁保护起来的多个方法,被看做一个原子操作。
  3. Java里面的对象包含三要素:唯一标识,状态和行为。三者总是绑定在一起的。如果Java对象的状态是不可变的(无状态、final),就没必要同步。

 

4.线程的状态

最后,总结一下线程的生命周期:

线程的状态包括:初始状态、可执行状态、执行状态、等待状态、阻塞状态、终止状态。等待状态和阻塞状态有什么区别呢?阻塞是为了同步(遇到敌人的时候),最终由操作系统内核唤醒,等待是为了协作(和朋友合作的时候);最终由其他线程唤醒。这两种状态都不占用cpu,执行状态才占用cpu。

 

5.并发包都有什么

从Java 5开始,引入了并发包。在后续的文章会逐一提到里面的详细内容。里面的内容都逃不出本文的范畴。无非是围绕创建、执行、同步、协作、获取执行结果……这几个主题进行抽象封装。让多线程程序写起来更轻松而已。

© 著作权归作者所有

共有 人打赏支持
士别三日

士别三日

粉丝 35
博文 30
码字总数 43081
作品 0
深圳
程序员
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
07/11
0
0
终于有人把Java内存模型说清楚了!

本文就来整体的介绍一下 Java 内存模型,读完本文以后,你就知道到底 Java 内存模型是什么,为什么要有 Java 内存模型,Java 内存模型解决了什么问题等。 本文中很多说法都是笔者自己理解后定...

51CTO技术栈
07/25
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他。

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的...

Java架构
07/11
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他

网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文...

java高级架构牛人
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nginx模块学习六 add_header 跨域访问

语法 Syntax: add_header name value [always];Default: --Context:http,server,location,if in location 例:/etc/nginx/conf.d/default.conf server {    listen       80; ......

Romanceling
今天
0
0
SpringBoot初探

#SpringBoot初探 三种创建SpringBoot项目的方式: 第一种:使用IDEA创建maven项目,选择maven-archetype-quickstart; 第二种:使用IDEA创建Spring Initializer,选择web组件; 第三种:使用...

向码而生
今天
2
0
IO

JAVA中IO技术:BIO、NIO、AIO 1、同步异步、阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方...

DemonsI
今天
0
0
org.apache.commons 常用工具类

一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不抛出异常。通常放在finally块。 toString 转换IO流、 Uri、 byte[]为String。 copy IO流数据复制,...

sprouting
今天
0
0
linux使用Inotify监控目录或者文件状态变更

基本概念: Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 需求: 1.有一个文件采集进程,...

mickelfeng
今天
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部