多线程_02_线程状态
示例1:
public class ThreadStatus {
public static void main(String[] args) {
// TIME_WAITING
new Thread(() -> {
while (true) {
try {
TimeUnit.SECONDS.sleep(100);
System.out.println(Thread.currentThread().getName() + "---线程启动");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "TIME_WAITING").start();
// WAITING
new Thread(() -> {
while (true) {
synchronized (ThreadStatus.class) {
try {
ThreadStatus.class.wait();
System.out.println(Thread.currentThread().getName() + "---线程启动");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "WAITING").start();
// BLOCKED
new Thread(new BlockDemo(),"BLOCKED_1").start();
new Thread(new BlockDemo(),"BLOCKED_2").start();
}
static class BlockDemo extends Thread{
@Override
public void run() {
synchronized (BlockDemo.class){
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
通过jps 获取到pid 然后 通过jstack pid 获取线程状态 打印的信息:
"BLOCKED_2" #17 prio=5 os_prio=0 tid=0x000001fc7989a000 nid=0x486c waiting for monitor entry [0x0000009d656ff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at smile.xiancheng.ThreadStatus$BlockDemo.run(ThreadStatus.java:47)
- waiting to lock <0x00000007414018b0> (a java.lang.Class for smile.xiancheng.ThreadStatus$BlockDemo)
at java.lang.Thread.run(Thread.java:748)
"BLOCKED_1" #15 prio=5 os_prio=0 tid=0x000001fc79897800 nid=0x4234 waiting on condition [0x0000009d655ff000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at smile.xiancheng.ThreadStatus$BlockDemo.run(ThreadStatus.java:47)
- locked <0x00000007414018b0> (a java.lang.Class for smile.xiancheng.ThreadStatus$BlockDemo)
at java.lang.Thread.run(Thread.java:748)
"WAITING" #13 prio=5 os_prio=0 tid=0x000001fc79877800 nid=0xe88 in Object.wait() [0x0000009d654fe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000740e4bbe0> (a java.lang.Class for smile.xiancheng.ThreadStatus)
at java.lang.Object.wait(Object.java:502)
at smile.xiancheng.ThreadStatus.lambda$main$1(ThreadStatus.java:28)
- locked <0x0000000740e4bbe0> (a java.lang.Class for smile.xiancheng.ThreadStatus)
at smile.xiancheng.ThreadStatus$$Lambda$2/1078694789.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"TIME_WAITING" #12 prio=5 os_prio=0 tid=0x000001fc79877000 nid=0x46c8 waiting on condition [0x0000009d653fe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at smile.xiancheng.ThreadStatus.lambda$main$0(ThreadStatus.java:16)
at smile.xiancheng.ThreadStatus$$Lambda$1/1324119927.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
可以清晰的看到每一个线程后都有一个java.lang.Thread.State:
字样 代表着当前线程的状态
示例2: 代码:
public class ThreadStatus {
public static void main(String[] args) {
Thread thread1 = new Thread(()->{},"Thread-eleven-1");
System.out.println(thread1.getName()+" 线程的线程状态为:"+thread1.getState());
Thread thread2 = new Thread(()->{
System.out.println(Thread.currentThread().getName()+" 线程的线程状态为:"+Thread.currentThread().getState());
},"Thread-eleven-2");
thread2.start();
Thread blockTest = new Thread(new BlockDemo());
blockTest.start();
Thread thread3 = new Thread(new BlockDemo(), "Thread-eleven-3");
thread3.start();
System.out.println(thread3.getName()+" 线程的线程状态为:"+thread3.getState());
}
static class BlockDemo extends Thread{
@Override
public void run() {
synchronized (BlockDemo.class){
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
控制台输出:
Thread-eleven-1 线程的线程状态为:NEW
Thread-eleven-2 线程的线程状态为:RUNNABLE
Thread-eleven-3 线程的线程状态为:BLOCKED
代码:
Thread thread1 = new Thread(()->{
while (true){
try {
TimeUnit.SECONDS.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread-eleven-测试");
Thread thread2 = new Thread(()->{
while (true){
try {
thread1.join(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Thread-eleven-4");
thread1.start();
thread2.start();
System.out.println(thread1.getName()+" 线程的线程状态为:"+thread1.getState());
System.out.println(thread2.getName()+" 线程的线程状态为:"+thread2.getState());
控制台输出:
Thread-eleven-测试 线程的线程状态为:RUNNABLE
Thread-eleven-4 线程的线程状态为:TIMED_WAITING
将代码中join方法的参数去掉后
Thread-eleven-4 线程的线程状态为:WAITING
代码:
Thread thread = new Thread(() -> {}, "Thread-eleven-6");
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getName()+" 线程的线程状态为:"+thread.getState());
控制台输出:
Thread-eleven-6 线程的线程状态为:TERMINATED
通过上述简单的示例了解到线程的状态,接下来通过JAVA源码分析线程的状态是否只有这些呢?进入Thread.java
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
总结线程的状态以及线程之间的切换:
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果