加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – isAlive()返回false

发布时间:2020-12-15 02:18:53 所属栏目:Java 来源:网络整理
导读:我有一个扩展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 starti
我有一个扩展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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读