|
JavaEE
JavaEE——进程与线程的关系
JavaEE——Thread类
PCB
还未创建, 还没有真正创建线程 (最初的状态)PCB
销毁了, 但是Thread对象还在 (最后的状态)就绪状态
, 可分成正在工作中和即将开始工作 (正在CPU上运行 or 在就绪队列中排队)阻塞 (sleep)
wait
阻塞状态
#
关注NEW, RUNNABLE, TERMINATED状态的转换
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
for (int i = 0; i < 100000; i++) {
}
});
//t 开始之前 NEW
System.out.println(t.getState());
t.start();
//t 正在工作 RUNNABLE
System.out.println(t.getState());
t.join();
//t 结束之后, TERMINATED
System.out.println(t.getState());
}
}
#
关注WAITING, BLOCKED, TIMED_WAITING状态的转换
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
t.start();
Thread.sleep(50);
//TIMED_WAITING
System.out.println(t.getState());
t.join();
}
}
# 注意 #
当前线程运行到sleep, 得到的状态是TIMED_WAITING
. 如果还未运行sleep, 得到的状态则是RUNNABLE
. 具体得到的是当前的哪个状态, 也是有一定的随机因素的, (毕竟程序在调度的时候具体执行顺序是不确定的)
public class Test {
public static void main(String[] args) throws InterruptedException {
final Object object = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("hello thread");
}
}
}, "t");
t.start();
}
}
使用 jconsole 可以看到 t 的状态是 BLOCKED
public class Test {
public static void main(String[] args) throws InterruptedException {
final Object object = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "t");
t.start();
}
}
使用 jconsole 可以看到 t 的状态是 WAITING
|
以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!