看到网上关于线程状态转移的博客,好多都没说明白。查了很多资料,汇总一篇,希望通过这一篇,能把这些状态转移解释明白,如果有什么没考虑到的,希望指正
转载注明出处原文地址:https://www.cnblogs.com/darope/p/12748184.html
Thread t1 = new Thread(
new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("hello : " + i);
}
}
}
);
// t1执行start()之后,处于就绪态,操作系统此时可以分配时间片给该线程,让该线程执行run方法体中的内容
t1.start();
public static void main(String[] args) {
// 线程1
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("t1 : running");
}
});
t1.start();
// 线程2
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("t2 : running");
}
});
t2.start();
}
public static void main(String[] args) {
// 线程1
Thread t1 = new Thread(() -> {
Thread.yield();
for (int i = 0; i < 10; i++) {
System.out.println("t1 : running " + i);
}
});
t1.start();
// 线程2
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("t2 : running " + i);
}
});
t2.start();
}
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hello : " + i);
}
}
);
// t1执行start()之后,处于就绪态,操作系统此时可以分配时间片给该线程
t1.start();
}
public class TestThread {
static Thread t1;
static Thread t2;
public static void main(String[] args) {
// 线程1
t1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
if(i == 50) {
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t1 : running " + i);
}
});
t1.start();
// 线程2
t2 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("t2 : running " + i);
}
});
t2.start();
}
}
这个很好理解,比如你就执行一个main函数的主线程,等待输入时,该线程是不会结束的,就是处于阻塞状态。
这里牵扯到对象锁的概念
public static void main(String[] args) {
Object o = new Object();
// 线程1
Thread t1 = new Thread(() -> {
synchronized (o) {
for (int i = 0; i < 10; i++) {
try {
if(i == 5) {
// 当i=5的时候,让出对象锁,t1进入等待队列
// 如果没人通知,t1一直等待,程序不会结束
o.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1 : running " + i);
}
}
});
t1.start();
// 线程2
Thread t2 = new Thread(() -> {
synchronized (o) {
for (int i = 0; i < 10; i++) {
System.out.println("t2 : running " + i);
}
// 这里t2得到锁,执行完线程方法之后一定要通知t1停止等待。
// 不然t1结束不了,处在一直等待通知的状态
o.notify();
}
});
t2.start();
}
死亡态不可逆,一旦线程进入死亡态,就再也回不到其他状态
原文:https://www.cnblogs.com/darope/p/12748184.html