
线程状态
一个多线程阻塞状态,线程的五个主要状态
新状态
创建Thread类的实例(对象)时,该线程进入新状态(未启动). 例如: 线程t1 =新的Thread().
操作状态(就绪状态):

创建线程对象后,其他线程(例如主线程)将调用该对象的start方法. 处于此状态的线程在可运行线程池中,等待线程调度选择它们以获取cpu使用权限. 例如: t1.start().
以下条件将进入操作状态:
运行状态
线程获取CPU资源并正在执行任务(#run()方法). 此时,除非该线程自动放弃CPU资源或进入更高优先级的线程,否则该线程将一直运行到结束.
阻止状态:

由于某种原因,正在运行的线程放弃CPU并挂起其执行多线程阻塞状态,即进入阻塞状态. 程进入可运行状态之前,有机会再次获得CPU资源并进入运行状态.
有4种阻止情况:
死亡状态
当线程完成执行或被另一个线程杀死时,该线程进入死状态,然后该线程无法进入就绪状态并等待执行.
有4种死亡类型:

第二个模拟线程状态
1. 模拟睡眠阻塞状态
package com.hello.state;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 倒计时,模拟网络阻塞
*/
public class BlockSleep03 {
public static void main(String[] args) throws InterruptedException {
// 倒计时10s,所以加10s
Date endDate = new Date(System.currentTimeMillis()+1000*10);
long end = endDate.getTime();
while (true) {
System.out.println(new SimpleDateFormat("mm:ss").format(endDate));
Thread.sleep(1000);
endDate = new Date(endDate.getTime() - 1000);
if (end - 10000 > endDate.getTime()) {
break;
}
}
}
}
2. 模拟死亡状态[外部干预]
package com.hello.state;
/**
* 模拟:终止线程
* 1、正常结束
* 2、外界干预
* 不要使用stop、destroy方法
*/
public class TerminateThread implements Runnable{
// 定义一个标志位
private boolean flag = true;
private String name;
public TerminateThread(String name) {
this.name = name;
}
@Override
public void run() { // 运行状态
int i=0;
while (flag){
System.out.println(name +"--->"+i++);
}
}
public void terminate() {
this.flag = false;
}
public static void main(String[] args) {
TerminateThread tt = new TerminateThread("CC");
new Thread(tt).start();// 新生状态->就绪状态
for (int i=0; i<99; i++) {
if (i==88){
tt.terminate(); // 结束状态
System.out.println("线程终止");
}
System.out.println("main--->"+i);
}
}
}

3. 模拟收益线程礼貌
package com.hello.yield;
/**
* yield礼让线程,暂停线程直接进入就绪状态
*/
public class YieldDemo02 {
public static void main(String[] args) {
new Thread(()->{
for(int i=0; i<20; i++) {
if (i%5==0) {
Thread.yield(); // 线程礼让
}
System.out.println("lambda-------" + i);
}
}).start();
for(int i=0; i<20; i++) {
System.out.println("main------"+i);
}
}
}
4. 模拟加入线程以切入行
package com.hello.join;
/**
* join 插队线程
*/
public class JoinDemo01 {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(()->{
for(int i=0; i<100; i++) {
System.out.println("lambda-------" + i);
}
});
t.start();
for(int i=0; i<100; i++) {
if (i==20) {
t.join(); // 插队,main被阻塞
}
System.out.println("main------"+i);
}
}
}
参考:
芋头源代码
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-246477-1.html
自己都想推翻萨达姆
好期待台宣独
濒海战斗舰也就是反恐和特种作战用的