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