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


见:situation 1 的 bT状态

0 0
原创粉丝点击