java 线程状态
来源:互联网 发布:增值税发票模拟软件 编辑:程序博客网 时间:2024/05/16 14:34
java定义的线程状态:NEW/RUNNABLE/WAITING/TIMED_WAITING/BLOCKED/TERMINATED
java的线程方法使得线程的状态转换如下:
1 sleep RUNNING--->TIMED_WAITING
2 join RUNNING--->WAITING
3 wait RUNNING--->WAITING
4 yield RUNNING--->RUNNABLE 不一定,因为调用yield的当前线程有可能被cpu再次选中执行,这种情况那么线程此时的状态是RUNNING
5 notify WAITING --->BLOCKED
6 notifyAll WAITING ---->BLOCKED
7 synchronized RUNNING--->BLOCKED
验证以上其中情况,代码和stack信息如下:
situation1:
import java.util.concurrent.TimeUnit;public class a{ public static void main(String[] args) { Runnable r = new b(); Thread bT = new Thread(r); bT.setName("bT"); bT.start(); synchronized(r){ System.out.println(Thread.currentThread().getName()); try{ TimeUnit.SECONDS.sleep(60); }catch(Exception e){ e.printStackTrace(); } } } static class b implements Runnable { public void run(){ synchronized(this){ System.out.println(Thread.currentThread().getName()); try{ TimeUnit.SECONDS.sleep(60); }catch(Exception e){ e.printStackTrace(); } } } }}~jstack 输出如下:
2017-02-14 10:01:23Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode): java.lang.Thread.State: RUNNABLE"bT" prio=10 tid=0x00007f3dc80b9000 nid=0x3028 waiting for monitor entry [0x00007f3dc13fb000] java.lang.Thread.State: BLOCKED (on object monitor) at a$b.run(a.java:26) - waiting to lock <0x00000007d704b910> (a a$b) at java.lang.Thread.run(Thread.java:745) java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004470> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x00000007d7004470> (a java.lang.ref.Reference$Lock)"main" prio=10 tid=0x00007f3dc8008800 nid=0x3017 waiting on condition [0x00007f3dcc88a000] 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:360) at a.main(a.java:15) - locked <0x00000007d704b910> (a a$b)"VM Thread" prio=10 tid=0x00007f3dc8071000 nid=0x3020 runnable"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f3dc801e000 nid=0x3018 runnable
situation 2
import java.util.concurrent.TimeUnit;public class f{ public static void main(String[] args) { Thread joinT = new Thread() { public void run() { try { for(int i = 0; i < Integer.MAX_VALUE;i++) { i++; } }catch(Exception e) { e.printStackTrace(); }//end try } };//end Thread joinT.setName("joinT"); joinT.start(); try { joinT.join(); }catch(Exception e) { e.printStackTrace(); } }}
jstack输出如下:
2017-02-14 15:09:08Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode): java.lang.Thread.State: RUNNABLE"joinT" prio=10 tid=0x00007f86780b9000 nid=0x3a53 runnable [0x00007f866f0ef000] java.lang.Thread.State: RUNNABLE at f$1.run(f.java:15) java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004470> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x00000007d7004470> (a java.lang.ref.Reference$Lock)"main" prio=10 tid=0x00007f8678008800 nid=0x3a42 in Object.wait() [0x00007f867e697000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d704b0f0> (a f$1) at java.lang.Thread.join(Thread.java:1281) - locked <0x00000007d704b0f0> (a f$1) at java.lang.Thread.join(Thread.java:1355) at f.main(f.java:30)"VM Thread" prio=10 tid=0x00007f8678071000 nid=0x3a4b runnable"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f867801e000 nid=0x3a43 runnable
situation 3
import java.util.concurrent.TimeUnit;public class b{ public static void main(String[] args) { Thread bt = new Thread() { public void run() { synchronized(this) { System.out.println(Thread.currentThread().getName()); try { wait(); }catch(Exception e) { e.printStackTrace(); } } } }; bt.setName("bt"); bt.start(); try { TimeUnit.SECONDS.sleep(3); }catch(Exception e) { e.printStackTrace(); } synchronized(bt) { System.out.println(Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(30); }catch(Exception e) { e.printStackTrace(); } bt.notify(); } }}
jstack输出如下
2017-02-14 10:07:53Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode): java.lang.Thread.State: RUNNABLE"bt" prio=10 tid=0x00007f73240b9000 nid=0x309c in Object.wait() [0x00007f731bdfc000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d704b8a8> (a b$1) at java.lang.Object.wait(Object.java:503) at b$1.run(b.java:17) - locked <0x00000007d704b8a8> (a b$1) java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004470> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x00000007d7004470> (a java.lang.ref.Reference$Lock)"main" prio=10 tid=0x00007f7324008800 nid=0x308b waiting on condition [0x00007f732b419000] 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:360) at b.main(b.java:40) - locked <0x00000007d704b8a8> (a b$1)"VM Thread" prio=10 tid=0x00007f7324071000 nid=0x3094 runnable
situation 7
- Java线程:线程状态
- Java线程与线程状态
- java线程状态管理
- Java 线程状态
- java线程(一) 状态
- Java线程状态
- Java线程状态转换
- Java多线程:线程状态
- Java 线程 状态
- java多线程-线程状态
- java线程状态
- java线程状态
- JAVA线程状态
- java 线程状态转换
- java线程的状态
- Java多线程:线程状态
- Java中的线程状态
- Java 线程状态
- 题目1481:Is It A Tree?
- 正则表达式详解
- [RK3288][Android6.0] 调试笔记 --- 使用竖屏软件后无法回到横屏状态
- hdoj2000
- 单例模式&工厂模式
- java 线程状态
- 怎样理解阻塞非阻塞与同步异步的区别?
- PNChart源码解析
- hdoj2001
- C文件操作
- Eclipse如何安装Genymotion模拟器
- nginx+rtmp+ffmpeg推流
- 【C#从入门到放弃】基本语法与函数
- 利用docker来部署web应用