Java 为什么线程实例的isAlive()方法给出错误的结果?

Java 为什么线程实例的isAlive()方法给出错误的结果?,java,multithreading,join,interrupt,Java,Multithreading,Join,Interrupt,我知道下面的代码给出的输出为false,但是当我们看到这个线程实例时,我们创建的线程被设置为守护进程并且仍然在运行,那么为什么调用Thread.isAlive()的方法返回false,给人一种错误的印象,即“Thread已经完成了工作,并且已经死了” 有人对此有想法吗?thread.join()是一个表达式,告诉主线程等待线程终止。因此,它只在线程完成后才转到打印语句。所以这是正确的结果,因为线程已经终止 如果删除join,您将看到结果为truethread.join()是一个表达式,告诉主线程

我知道下面的代码给出的输出为false,但是当我们看到这个线程实例时,我们创建的线程被设置为守护进程并且仍然在运行,那么为什么调用Thread.isAlive()的方法返回false,给人一种错误的印象,即“Thread已经完成了工作,并且已经死了”

有人对此有想法吗?

thread.join()
是一个表达式,告诉主线程等待
线程
终止。因此,它只在线程完成后才转到打印语句。所以这是正确的结果,因为
线程
已经终止

如果删除
join
,您将看到结果为true

thread.join()
是一个表达式,告诉主线程等待
线程
终止。因此,它只在线程完成后才转到打印语句。所以这是正确的结果,因为
线程
已经终止


如果删除
连接
,您将看到结果为真

它不显示假?因为
join()
将等待线程完成。在本例中,线程是否是守护进程也无关紧要。由于使用了
thread.join(),在线程完成之前,不会调用最后一行将连接
main
线程以等待其结束。给人一种错误的印象,认为“线程已经完成了工作,实际上它已经死了。
join()
使程序等待线程完成,所以当您打印
thread.isAlive()时
,线程将失效。大家好,对于那些这样说的人,程序不会打印false或程序不会执行System.out.println(thread.isAlive());请尝试执行它,我在请求帮助之前执行了该程序,即使现在我也执行了它,但它只将输出作为false。它不会显示false?因为
join()
将等待线程完成。在本例中,线程是否为守护进程也无关紧要。由于使用了
thread.join();
将连接
main
线程等待其结束,因此在线程完成之前不会调用最后一行。给人错误的印象是“线程完成了工作,实际上它是死的
join()
使程序等待线程完成,因此当您打印
thread.isAlive()
时,线程将失效。大家好,对于那些这样说的人,程序不会打印false或程序不会执行,System.out.println(thread.isAlive());请尝试执行它,我在请求帮助之前执行了该程序,即使现在我也执行了它,它仍然只提供false输出。嗨,Dima,但最后一行“thread.isAlive()”是检查线程是否活动,是否存在join调用此print语句必须打印为true。但它只是印刷错误。没有join意味着print语句仍然由主线程执行,因为主线程不需要等待,所以我怀疑是否有join(),它应该总是只打印true。对于我提到的守护进程线程。正如我所说,join实际上是在等待线程终止,因此它在i Dima之后将永远不会处于活动状态,但最后一行“thread.isAlive()”是检查线程是否处于活动状态,join调用是否存在此print语句必须打印为true。但它只是印刷错误。没有join意味着print语句仍然由主线程执行,因为主线程不需要等待,所以我怀疑是否有join(),它应该总是只打印true。对于我提到的守护进程线程,正如我所说的,join实际上是在等待线程终止,因此它在终止后将永远不会处于活动状态
public class MyThreads {

    private static class MyDaemonThread extends Thread {

        public MyDaemonThread() {
            setDaemon(true);
        }

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new MyDaemonThread();
        thread.start();
        thread.join();
        System.out.println(thread.isAlive());
    }
}