【Java并发001】使用级别:线程相关知识
一、前言
本文介绍Java线程相关知识(不包括线程同步+线程通信,这个内容在笔者的另一篇博客中介绍过了),包括:线程生命周期、线程优先级、线程礼让、后台线程、联合线程。
二、线程生命周期
2.1 引子:线程生命周期
本节阐述线程生命周期相关知识,Java支持多线程技术,除了Main函数主导一个main线程以外,可以用代码创建一系列的前台线程、后台线程(本文后面会讲),每一个线程都有自己的生命周期,线程生命周期的不同状态有不同的说法:
(1)有的说Java线程5种状态,这是因为将“等待状态Waiting+限时等待状态Timed_Waiting”作为一种状态,5种状态为:
新建状态New、可运行状态Runnable(Running+Ready)、等待状态Waiting+Timed_Waiting、阻塞状态Blocked、结束状态Terminated
(2)有的说Java线程6种状态,这是因为将将Running和Ready两种状态拆分开了,6种状态为:
新建状态New、准备状态Ready、运行状态Running、等待状态Waiting+Timed_Waiting、阻塞状态Blocked、结束状态Terminated
或者将等待状态Waiting和限时等待状态Timed_Waiting两种状态拆开,6种状态为:
新建状态New、可运行状态Runnable(Running+Ready)、等待状态Waiting、计时等待状态Timed_Waiting、阻塞状态Blocked、结束状态Terminated
(3)有的说Java线程7种状态,这是因为将将Running和Ready两种状态拆分开、等待状态Waiting和限时等待状态Timed_Waiting两种状态拆开,7种状态为:
新建状态New、准备状态Ready、运行状态Running、 等待状态Waiting、计时等待状态Timed_Waiting、阻塞状态Blocked、结束状态Terminated
不管采用哪种说法,Java线程状态以下几种,新建状态New、可运行状态Runnable(Running+Ready)、等待状态(等待状态Waiting+限时等待状态Timed_Waiting)、阻塞状态Blocked、结束状态Terminated
本文采用6种状态的说法,下面2.3 会具体阐述。
2.2 用一段代码来演示一个完整的生命周期
代码1:
package mypackage;
// 线程的生命周期,演示线程的六种状态: NEW 新建状态 RUNNABLE 可运行状态(ready就绪状态+running运行状态) TIMED_WAITING 计时等待状态
// WAITING 等待状态 BLOCKED 阻塞状态 TERMINATED 终止状态(进入终止状态后只能结束,无法再返回回来)
class Block { //共享资源类
public boolean waitStatus = true;
public void waitOp() throws InterruptedException {
synchronized (this) {
System.out.println(Thread.currentThread().getName() + " 进入wait");
wait();
// waitThread被notifyThread唤醒
System.out.println(Thread.currentThread().getName() + " next to Block.wait(), in the loop");
}
}
public void notifyOp() {
synchronized (this) {
this.waitStatus = false; // 修改标志位 等待状态waitStatus=false
notifyAll(); // 唤醒WaitRunnable
System.out.println(Thread.currentThread().getName() + " 向正在wait当前对象的线程发出notify");
}
}
}
class WaitThread implements Runnable {
private Block block;
public WaitThread(Block block) {
super();
this.block = block;
}
@Override
public void run() {
//该方法中测试了 sleep(毫秒数)进入计时等待状态和wait()进入等待状态
// 前者只能等待2秒后自动唤醒 后者由notifyThread使用notify()/notifyAll()唤醒
try {
System.out.println(Thread.currentThread().getName() + " 被启动,开始执行...");
// Thread.sleep(毫秒数) 进入计时等待状态 线程计时等待状态中,线程依然存活,线程isAlive() 仍然为true
System.out.println(Thread.currentThread().getName() + " 开始sleep 2s");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " 从sleep中醒来");
// 从sleep中醒来后,进入wait状态
while (block.waitStatus) {
block.waitOp(); // 进入等待状态,线程在等待状态中,线程依然存活,线程isAlive()
// 仍然为true,等待状态只有一个出口,notify()/notifyAll()
// waitThread被notifyThread唤醒
System.out.println(Thread.currentThread().getName() + " next to WaitRunnable.waitOp(), in the loop");
}
System.out.println(Thread.currentThread().getName() + " out of wait loop");
System.out
