java – isAlive()返回false
我有一个扩展Thread类的MyTunnel类:
public class MyTunnel extends Thread { protected Object obj; public MyTunnel() { super(MyTunnel.class.getName()); obj = new Object(); prepare(); } public void prepare() { System.out.println("Before starting..."); start(); synchronized(obj) { try { obj.wait(3000); } catch (InterruptedException e) { System.out.println("Error while waiting thread to start"); } } System.out.println("After starting..."); } @Override public void run() { System.out.println("running..."); } } 当我在主线程上运行以下代码时: System.out.println("Before creating tunnel..."); MyTunnel tunnel = new MyTunnel(); System.out.println("After creating tunnel..."); System.out.println("Is tunnel alive ? " + tunnel.isAlive()); 我看到打印出这样的: Before creating tunnel... Before starting... running... After starting... After creating tunnel... Is tunnel alive ? false 我的问题是,为什么tunnel.isAlive()返回false(在上次打印输出消息中)? 但是,如果我将prepare()函数更改为: public void prepare() { System.out.println("Before starting..."); start(); System.out.println("After starting..."); } 再次运行代码,tunnel.isAlive()然后返回true.为什么? 解决方法
第一种情况:
你当前的(“主”)线程启动新线程,然后调用obj.wait(3000);导致当前线程等待超时3秒.这不是等待的新线程! 当前线程等待时,执行新线程.它只写“正在运行……”并且很快完成. 因此,“main”线程恢复(3秒后),新线程已经死亡,因此isAlive()返回false. 第二种情况: 您当前的(“主”)线程启动新线程并继续执行. 当主线程只执行一些System.out.println()调用时,新线程可能会运行也可能不会运行. 因此,新线程有可能尚未执行且新线程仍处于活动状态,因此isAlive()返回true. 请注意,可能会发生新线程刚刚在第二个场景中启动后执行.所以即使在第二种情况下,isAlive()也可能返回false,但机会低于第一种情况( – >竞争条件). 附:如果在调用isAlive()之前在第二个场景中包含任何“重”操作,那么结果可能是假的.请尝试以下方法: System.out.println("Before creating tunnel..."); final MyTunnel tunnel = new MyTunnel(); System.out.println("After creating tunnel..."); for (int i = 0; i < 100; ++i) { System.out.print(""); } System.out.println("Is tunnel alive ? " + tunnel.isAlive()); // returns false on my machine (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |