线程状态如何在Java多线程中工作?

时间:2016-05-06 16:17:27

标签: java multithreading

public class ThreadState{
    public static void main(String[] args){
        Thread one = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getState());
            }
        });
        Thread two = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getState());
            }
        });
        System.out.println(one.getState());
        System.out.println(two.getState());

        one.start();
        two.start();

        System.out.println(one.getState());
        System.out.println(two.getState());
        System.out.println(one.getState());
        System.out.println(two.getState());

        System.out.println("Main ");
    }
}

我正在尝试在java中学习Thread.State但我在它们之间感到困惑。当我运行上面的代码时,我得到了多个结果(我知道因为多线程)。

但我无法理解他们的状态。

1)这里有两个我想学习的输出你可以解释它们吗?

NEW
NEW
RUNNABLE
RUNNABLE
RUNNABLE
RUNNABLE
Thread-0 RUNNABLE
Thread-1 RUNNABLE
Main

第二个是这个。

NEW 
NEW 
RUNNABLE 
BLOCKED
BLOCKED // 2) Why go to again BLOCKED state? as before it was in RUNNABLE state
BLOCKED
Main
Thread-0 RUNNABLE
Thread-1 RUNNABLE

我已经知道什么是NEW状态,什么是RUNNABLE状态。但我对BLOCKED和WAITING状态感到困惑。

Student object1 = new Student(); // any shared resource

Thread t1 = new Thread(/*......*/); => NEW State
Thread t2 = new Thread(/*......*/); => NEW State

t1.start(); => RUNNABLE STATE
t2.start(); => RUNNABLE STATE

`t1` and `t2` trying to get lock on object1 and `t1` successfully got locked on object1.

3)现在t2将处于BLOCKED状态还是WAITING状态?

`t1` called `wait()` method and released lock.
`t2` got the lock and `t1` now in WAITING state.

`t2` called `notify();` and released lock.
`t1` got the lock 

4)t2将处于封锁状态或等待状态?

`t1.run();` finished => TERMINATED State
`t2.run();` finished => TERMINATED State

5)即使线程死了,JVM仍保留每个线程的历史记录?如果不是那么JVM如何显示已经消失的线程的终止状态?

3 个答案:

答案 0 :(得分:1)

BLOCKED表示:“等待监视器锁定被阻塞的线程处于此状态。”这意味着涉及同步。您没有使用任何同步块,但Thread在内部执行。鉴于它是RUNNING然后BLOCKED,它可能是在私有Thread.exit()方法中发生的同步。例如,Group.threadTerminated()在组上同步。

WAITING表示该线程已调用Object.wait()。为了做到这一点,它必须拥有监视器(与调用对象等待相关联),因此它不能在该监视器上被阻塞。

3& 4如果我跟随,答案是3)阻止和4)运行或终止

至于JVM是否保留了历史记录,我不确定这是JVM的要求,但只要你有一个对线程对象的引用,你应该能够看到最后一个状态是什么。请记住,Thread对象只是将线程表示为Object。实际的线程是OS /硬件特定的。

答案 1 :(得分:0)

  

1)这里有两个我想学的输出你能解释一下吗?   我已经知道什么是NEW状态,什么是RUNNABLE状态。但我对BLOCKED和WAITING状态感到困惑。

解释州here

  

3)现在t2将处于BLOCKED状态还是WAITING状态?

在您描述的情况下,t2应该处于RUNNABLE状态,恕我直言。它释放了锁,我。即离开synchronized电话周围的notify()区块。

  

4)t2将处于BLOCKED State或Waiting State?

我没有得到这个 - 它一旦真正终止就应该处于TERMINATED状态。

  

5)即使线程已经死亡,JVM仍保留每个线程的历史记录?如果不是那么JVM如何显示已经消失的线程的终止状态?

即使线程消失,只要您拥有对它的引用,控制该线程的对象就可用。此对象告诉您该线程已终止。

答案 2 :(得分:0)

  

1)这里有两个我想学习的输出你可以解释它们吗?

请参阅主题states文章,以便更好地理解&导致线程状态发生变化的各种条件。

线程可以处于以下状态之一:

NEW :尚未启动的线程处于此状态。

RUNNABLE :在Java虚拟机中执行的线程处于此状态。

BLOCKED:处于阻塞状态的线程正在等待监视器锁定,以便在调用synchronized后输入同步的块/方法或重新输入Object.wait块/方法。

WAITING:无限期等待另一个线程执行特定操作的线程处于此状态。

由于调用以下方法之一,线程处于等待状态:

Object.wait with no timeout
Thread.join with no timeout
LockSupport.park

TIMED_WAITING:正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。

由于在指定的正等待时间内调用以下方法之一,线程处于定时等待状态:

Thread.sleep
Object.wait with timeout
Thread.join with timeout
LockSupport.parkNanos
LockSupport.parkUntil

TERMINATED:已退出的线程处于此状态。

  

2)为什么再次进入BLOCKED状态?和以前一样处于RUNNABLE状态

线程被阻塞,等待监视器锁定处于此状态。

对于查询3和4:如果线程(t1)释放锁定,则其他等待线程(t2)将从BLOCKED状态进入RUNNABLE状态。如果t1线程已完成执行,则它将进入TERMINATED状态。如果t2完成执行,它将进入TERMINATED状态。

  

5)即使线程死了,JVM仍保留每个线程的历史记录?如果不是那么JVM如何显示已经消失的线程的终止状态?

由于您的程序保存了线程的引用,因此这些线程的状态为TERMINATED。如果释放这些引用,JVM就没有这些线程的历史记录