文档章节

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

© 著作权归作者所有

共有 人打赏支持
士别三日

士别三日

粉丝 38
博文 30
码字总数 43081
作品 0
深圳
程序员
java核心技术-多线程之线程基础

说起线程,无法免俗首先要弄清楚的三个概念就是:进程、线程、协程。OK,那什么是进程,什么是线程,哪协程又是啥东西。进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,...

xgoing
08/19
0
0
从多核硬件架构,看Java内存模型

在了解Java内存模型之前,先来看一下多核硬件架构。 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存...

消失er
09/02
0
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内存模型是什么,就把这篇文章发给他!

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

技术小能手
09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

软件测试工具书籍与面试题汇总下载(持续更新)

简介 本文是https://github.com/china-testing/python-api-tesing/blob/master/books.md 的节选。 欢迎转载,转载请附带此简介,谢谢! 试题 软件测试综合面试题(高级测试)-试题.pdf 软件测试...

python测试开发人工智能安全
12分钟前
0
0
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 解决

有个项目使用的log4j进行日志记录的,同时也是用log4j中的数据库配置直接把相应级别的日志直接插入oracle。 在把项目部署的另一个内网环境时候,把项目的其他配置都改了,唯独log4j中的数据库...

哥本哈根的小哥
22分钟前
0
0
耗时 2 年,用 8.5 万块乐高积木最牛复刻 Apple Park

简评:国外大佬复刻 Apple Park,看了一下细节,确实厉害!只有你想不到,没有乐高拼不起来的,有没有乐高大神挑战一下? 苹果公园以各种各样的方式鼓舞人心,让人感兴趣。从建筑、可持续性和...

极光推送
23分钟前
0
0
记一次查找Hdfs磁盘占用空间比实际存储文件大4倍的原因

在一次主备namenode发生切换后,重启datanode节点,发现磁盘空间很大,想清理一下磁盘, 通过命令Hdfs dfs -du -h --max-depth=1 / 发现实际文件的大小只有8g,通过du -h --max-depth=1 /ha...

PageYi
50分钟前
4
0
阿里云推荐引擎使用教程

产品概述: 推荐引擎(Recommendation Engine,以下简称RecEng,特指阿里云推荐引擎)是在阿里云计算环境下建立的一套推荐服务框架,目标是让广大中小互联网企业能够在这套框架上快速的搭建满...

mcy0425
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部