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

标签 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 将处于 BLOCKED 状态还是等待状态?

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

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

最佳答案

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

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

对于 3 和 4,如果我遵循,答案是 3) BLOCKED 和 4) RUNNING 或 TERMINATED

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

关于java - Java 多线程中线程状态如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077081/

相关文章:

java - 什么是NullPointerException,我该如何解决?

java - 从内部类引用的局部变量必须是最终的或有效最终的

asp.net - SQL Server,连接池与特殊情况下的静态连接

java - 使用Java在MySql数据库中插入汉字

java - 重新加载 jsp 并在 servlet 上丢失 request.getParameter ("...")

java - 用于在 Java 中操作视频的库/教程

java - 无法在 Android 中正确实现我的线程

java - for 循环创建阿基米德螺线时出现问题

Python 的 asyncore 客户端向服务器发送周期性数据

ios - coreData executeFetchRequest 方法的竞争条件导致 nil 数据的问题