2019独角兽企业重金招聘Python工程师标准>>>

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

转载于:https://my.oschina.net/leaforbook/blog/1823980

Java线程之核心概念相关推荐

  1. java线程的基本概念

    进程和线程 进程的诞生 操作系统中有2个任务A,B,任务A先执行,执行到一半需要io,因此要大量时间,在这个时间段内cpu是空闲的,浪费了资源,于是就有进程,当A暂时无法利用cpu,但是又不能销毁时, ...

  2. 干货推荐|Java并发编程核心概念一览,面试必备!

    本文由读者 muggle 投稿,muggle 是一位具备极客精神的 90 后单身老实猿,对 Java 并发编程有着深入研究,本文较长,大伙认真读完一定会有所收获.muggle 个人博客地址是 http ...

  3. Java线程池核心线程数与最大线程数的区别

    线程池策略 corePoolSize:核心线程数:maximunPoolSize:最大线程数 每当有新的任务到线程池时, 第一步: 先判断线程池中当前线程数量是否达到了corePoolSize,若未达 ...

  4. java线程池的概念_Java线程池的基本概念以及生命周期

    一.为什么要实现线程池? 线程的创建与销毁对于CPU而言开销较大,通过池化技术可避免重复的创建与销毁线程. 方便与线程资源统一管理. 二.几种常见的线程池以及核心参数 不推荐使用Executor创建线 ...

  5. java 线程的基本概念_Java多线程——多线程的基本概念和使用

    一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在 ...

  6. java 线程的基本概念_Java多线程——基本概念

    线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...

  7. Java线程优先级的概念

    线程是区分优先级的,优先级越高越可能优先执行 在Java程序中我们可以手动的来设置线程的优先级,设置方法如下: setPriority() 我们来看这样的一串代码 package com.epoint ...

  8. JAVA线程1 - 基本概念

    2019独角兽企业重金招聘Python工程师标准>>> 一.进程 进程是指一个内存中运行的应用程序,每 个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windo ...

  9. Java线程类核心方法

    1. Thread.currentThread() 返回当前正在执行的线程对象. 示例: 2. thread.isAlive() 判断当前线程是否处于活动状态.活动状态是指线程已经启动且尚未终止.线程 ...

最新文章

  1. ckeditor上传图片文件,研究了一天,终于...
  2. 优化体系结构 - 解决多样性数据源
  3. SpringEL expression:
  4. HDFS中心缓存管理
  5. C程序100例 第二题
  6. 分段函数是不是一定初等函数_分段函数的微积分例题选讲
  7. C++.Net在Release方式下单步调试时需要修改一些设置,否则变量会有错位或乱码,切记!...
  8. BAT等大厂十年研发经历,总结了12开发条经验(墙裂推荐)
  9. 美国公司报告称2020年中国会非常穷 我学者驳斥[转]
  10. Git查看本地配置信息
  11. 【女装2018新款潮碎花半身裙韩版气质两件套裙子】http://m.tb.cn/h.3aHr1L7
  12. 六年的计算机电源坏啦,电脑电源坏了有什么症状
  13. TI Sitara AM57x DSP+ARM + Xilinx Artix-7 FPGA核心板 规格书资料
  14. ubuntu conda 更新、下载模块包权限问题 'Permission denied'
  15. C语言——常量,变量
  16. Debian7升级glibc至2.15
  17. C# GroupBy 用法
  18. 有监督学习神经网络的回归拟合——基于红外光谱的汽油辛烷值预测(Matlab代码实现)
  19. 计算斐波那契数列第100项(二维数组思维转换)
  20. 解决 : ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directo

热门文章

  1. 网站首页head区代码规范
  2. Windows下打印utf-8文件
  3. 汇编LAHF指令学习 - 使用emu8086
  4. drop、delete与truncate的区别 和 delete是否记录日志
  5. 单源最短路——dijkstra算法
  6. Windows上安装scapy
  7. redis学习(七)jedis客户端
  8. ConcurrentHashMap 内部实现分析
  9. xamarin学习之路 一、vs2015 环境搭建
  10. HDU 5001 概率DP || 记忆化搜索