在Java面试的时候,经常会问到Java并发编程相关的多线程、线程池、线程锁、线程通信等面试必考点,比如:

Java并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项

Java并发编程系列:4种常用Java线程锁的特点,性能比较、使用场景

Java并发编程系列:CountDownLatch、Semaphore等4大并发工具类详解

高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

今天主要分享多线程状态流转与通信,这也是面试中必考的基础知识点。

多线程的基本概念

1.进程

进程是操作系统进行资源分配和调度的基本单位。

2.线程

线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。

3.多线程

什么是多线程呢?即就是一个程序中有多个线程在同时执行。

线程的生命周期

java中每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。

1.新建状态

使用 new Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。

2.就绪状态

调用了start()方法之后,该线程就进入就绪状态(就绪队列中),等待JVM里线程调度器的调度。

3.运行状态

执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

4.阻塞状态

如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。

5.死亡状态

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

线程的调度策略

线程调度是指系统为线程分配处理器使用权的过程。

Java 使用的线程调度是抢占式调度,在抢占式调度下,优先级最高的任务一直执行,直到它进入等待或死亡状态或更高优先级的任务出现,优先级高的线程比优先级低的线程优先执行。

在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略。 在 JVM 中体现为让可运行池中优先级高的线程拥有CPU 使用权。

线程之间的通信与协作

上面比较清楚的显示了线程的状态流转,其实重点主要是掌握运行、阻塞、就绪之间的通信机制。

1.sleep()和yield()和join()

1)sleep()方法作用:让当前线程睡眠一段时间,期间不会释放任何持有的锁。

2) yield()方法作用:让出该线程的时间片给其它线程。线程调用了yield()方法,表示放弃当前获得的CPU时间片,回到就绪状态。最后由线程调度重新选择就绪状态的线程分配CPU资源。

3)join()方法作用:暂停当前线程,等待被调用线程指向结束之后再继续执行。

注意:

1)sleep(long)方法仅释放CPU使用权,锁仍然占用。

2)调用join()的时候,当前线程不会释放掉锁。

2.wait()和notify() 方法和notifyAll()方法

1)wait()方法的作用:让该线程处于等待状态。

2)notify()方法的作用:唤醒处于wait的线程。

3)notifyAll()方法的作用:唤醒所有处于wait状态的线程。

注意:

1)wait()方法会释放CPU执行权 和 占有的锁。

2) 线程调用wait()方法后,让该线程处于等待状态。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。wait和notify必须配套使用,即必须使用同一把锁调用。

你可能也喜欢:

  1. Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景
  2. Java多线程系列(一):最全面的Java多线程学习概述
  3. Java多线程系列(六):深入详解Synchronized同步锁的底层实现
  4. Java多线程系列(十):源码剖析AQS的实现原理
  5. Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现
  6. Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景

Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作相关推荐

  1. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括: 1. interrupt()说明 2. 终止线程的方式   2.1 终止处于"阻塞状态"的线 ...

  2. Java多线程学习二十:HashMap 为什么是线程不安全的

    为什么 HashMap 是线程不安全的?而对于 HashMap,相信你一定并不陌生,HashMap 是我们平时工作和学习中用得非常非常多的一个容器,也是 Map 最主要的实现类之一,但是它自身并不具备 ...

  3. Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

    为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被 ...

  4. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  5. Java多线程系列--【JUC线程池 02】- 线程池原理(一)

    参考:http://www.cnblogs.com/skywang12345/p/java_threads_category.html 概要 在前面一章"Java多线程系列--"J ...

  6. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  7. Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  8. Java多线程系列(一):最全面的Java多线程学习概述

    Java并发编程的技能基本涵括以下5方面: 多线程 线程池 线程锁 并发工具类 并发容器 多线程的4种创建方式 继承Thread 实现Runnable接口 实现Callable接口 以及线程池来创建线 ...

  9. Java多线程系列--“JUC锁”05之 非公平锁

    转载自:http://www.cnblogs.com/skywang12345/p/3496651.html点击打开链接 概要 前面两章分析了"公平锁的获取和释放机制",这一章开始 ...

最新文章

  1. 在jupyter中使用matlab
  2. centos8 改主题颜色 黑色改白色
  3. (HDU)1019 --Least Common Multiple(最小公倍数)
  4. wordpress教程:默认http头信息X-Pingback的隐藏与修改
  5. 整理与总结Python关于对文件的操作
  6. 老员工在线“黑”华为:早期手机难看丢人 习惯另外带苹果三星
  7. 知己知彼-关于Oracle安全比特币勒索问题揭秘和防范
  8. 思考问题的一些方法:一般化,特殊化和归纳类比
  9. Plugin For KanColleViewer – Provissy Tools V1.0
  10. 灰度共生矩阵纹理特征提取matlab,灰度共生矩阵纹理特征提取的Matlab实现
  11. EasyExcel筛选和冻结首行
  12. Linux常用命令100个用法
  13. android 控制空调,控制精灵空调遥控器
  14. python的合法命名,以下不是Python语言合法命名的是:A、MyGod5B、5MyGodC、_...
  15. 易语言多线程任务分配让不同的线程账号执行不同的多个任务
  16. java取余(java取余数的函数)
  17. 【Jetpack】WorkManager
  18. js中常用的Math函数方法
  19. java中PO、BO、VO、DTO、POJO、DAO是什么?
  20. 3D打印将对零售模式产生颠覆影响,能否抓住机遇

热门文章

  1. 用Sass创建MetaFizzy效果
  2. GHOSTXP_SP3电脑公司快速安装机版V2013
  3. 6、使用infowindow
  4. Linux下编译Jsoncpp
  5. leveldb资料整理
  6. UDT中select异常
  7. linux java远程调试_idea远程linux代码调试
  8. 学计算机耗脑子,为什么补脑——脑是耗能大户
  9. LeetCode 1774. 最接近目标价格的甜点成本(DFS / 01背包)
  10. 天池 在线编程 LR String