在Java面试的时候,经常会问到与Java并发编程相关的面试要求,比如多线程、线程池、线程锁、线程通信等,比如:
Java并发编程系列:Java线程池的用法、核心操作原理及注意事项。
Java并发编程系列:四种常用Java线程锁的特点、性能比较和使用场景。
Java并发编程系列:详细解释四个并发工具类,如CountDownLatch和Semaphore
高并发编程系列:ConcurrentHashMap (JDK1.7和JDK1.8)的实现原理
史上最强多线程面试44个问答:线程锁、线程池、线程同步等。
今天主要分享多线程状态流和交流,这也是面试中的基础知识。
多线程的基本概念
1.过程
进程是操作系统分配和调度资源的基本单元。
2.线
线程是进程中的执行单元,负责当前进程中程序的执行。一个进程中至少有一个线程。
3.多线程操作
什么是多线程?也就是说,程序中的多个线程同时执行。
线程的生命周期
java中的每个线程都需要经历五种状态:ssdl、就绪、运行、阻塞和死亡。线程从ssdl到死亡的状态变化称为生命周期。
1.新状态
当使用新的线程类或其子类创建线程对象时,线程对象处于新创建的状态。
2.就绪状态
调用start()方法后,线程进入就绪状态(在就绪队列中),等待JVM中线程调度器的调度。
3.运行状态
执行Run(),然后线程运行。正在运行的线程是最复杂的,它可以被阻塞、就绪和死亡。
4.阻塞状态
如果一个线程执行休眠、挂起等方法,丢失了占用的资源,那么这个线程就会从运行状态进入阻塞状态。
5.死亡状态
当正在运行的线程完成其任务或发生其他终止条件时,该线程将切换到终止状态。
线程的调度策略
线程调度是指系统将处理器使用权分配给线程的过程。
Java中使用的线程调度是抢占式调度。在抢占式调度下,优先级最高的任务一直执行到进入等待或死亡状态或优先级较高的任务出现,优先级较高的线程先于优先级较低的线程执行。
在Java多线程环境下,为了保证所有线程都能按照一定的规则执行,JVM实现了一个线程调度器,定义了线程调度的策略。在JVM中,可运行池中优先级较高的线程有权使用CPU。
线程之间的通信与协作
上面清楚地显示了线程的状态流。其实关键是要掌握运行、阻塞、就绪之间的通信机制。
1.sleep()和yield()以及join()
1)sleep()方法:的功能使当前线程休眠一段时间,在此期间不会释放持有的锁。
yield()方法的作用:将这个线程的时间片交给其他线程。线程调用yield()方法,意味着放弃当前获取的CPU时间片,返回就绪状态。最后,线程调度重新选择就绪线程来分配CPU资源。
3)join()方法的作用:暂停当前线程,等待被调用线程指向结束后再继续执行。
注意:
1)1)sleep(long)方法只释放CPU使用权,锁仍然被占用。
2)调用join()时,当前线程不会释放锁。
2.wait()和notify()方法以及notifyAll()方法
1)wait()方法的作用:让线程等待。
2)notify()方法的功能是等待线程结束等待。
3)notifyAll()方法的作用是唤醒所有处于等待状态的线程。
注意:
1)1)wait()方法将释放对CPU执行权和占有权的锁定。
2)线程调用wait()方法后,让线程等待。进入这种状态后,无法自动唤醒,必须依靠其他线程调用notify()或notifyAll()方法才能唤醒。Wait和notify必须一起使用,也就是说,它们必须用同一个锁来调用。
你可能也喜欢:
Java多线程系列(7):并发容器原理,7大型并发容器及使用场景详解Java多线程系列(1):Java多线程学习最全面概述Java多线程系列(6):Synchronized同步锁底层实现深度讲解Java多线程系列(10):AQS实现原理源代码分析Java多线程系列(5):线程池的实现原理、优势和风险, 以及实现Java多线程的四种线程池系列(4):四种常用Java线程锁的特性,性能比较,使用场景,不花钱,不接触,易入门,让你每年多赚10万!