- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 MyTunnel
类,它扩展了 Thread
类:
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秒。 等待的不是新线程!
当当前线程等待时,新线程被执行。它只写“正在运行...”并很快完成。
因此,“主”线程恢复(3 秒后),新线程已经死亡,所以 isAlive()
返回 false
。
您的当前(“主”)线程启动新线程并继续执行。
新线程可能运行也可能不运行,而主线程只执行一些System.out.println()
调用。
因此,有可能新线程尚未执行且新线程仍处于 Activity 状态,因此 isAlive()
返回 true
。
请注意,在第二种情况下,可能会发生新线程刚启动就执行的情况。因此,即使在第二种情况下 isAlive()
可能 返回 false
,但几率低于第一种情况(-> 竞争条件) .
附言如果您在调用 isAlive()
之前在第二种情况中包含任何“重”操作,那么结果很可能是 false
。请尝试以下操作:
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
关于java - isAlive() 返回假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43116737/
我有一个 MyTunnel 类,它扩展了 Thread 类: public class MyTunnel extends Thread { protected Object obj;
我收到此错误: "non-static method isAlive() cannot be referenced from a static context" 这段代码有什么问题..请。 我想检测线
我需要一些有关 isAlive() 和 join() 函数的帮助。我了解如何以以下形式实现 isAlive() 和 join(): public class mthread implements Ru
我是多线程新手;这是启动线程的正确方法吗? if(!sesThread.isAlive()) { try { sesThread.start(); }catch(Ill
我正在尝试使用 isALive 和 join 方法,但它抛出一个错误,如找不到符号....请告诉我这个程序中的错误到底在哪里。join 方法的用途是什么。我知道这是等待线程完成,但我想要详细信息。 c
我正在寻找一种方法来在对象引用被垃圾回收时偷偷调用回调函数。 我知道我可以将对象包装在一个弱引用中,但我仍然需要轮询一组引用以了解状态更改。 我宁愿不进行轮询,因为当什么都没有发生时,这似乎是在浪费
在 Web Controller 中,我有一个接收请求的父线程。有些请求需要很长时间才能处理。为了防止客户端超时,我将父线程设置为每 2 秒发回一个字节,而子线程正在执行操作的耗时部分。 我想确保我考
这个问题已经有答案了: Thread.isAlive() vs Thread.join() (3 个回答) 已关闭 9 年前。 有两种方法可以确定线程是否已完成。首先,您可以调用isAlive()在线
当我调用 isAlive() 时,我看到的代码形式如下:m.thrd.isAlive()。 m 实现可运行接口(interface)。 thrd 是 Thread 的对象。 我理解isAlive()是
作为 this question 的后续行动,我有以下代码: using System; using System.Runtime.InteropServices; namespace Console
如解释here ,如果 WeakReference 的 IsAlive 返回 true,则它不可信任。现在,我正在尝试了解 correct way使用这个: 不正确: WeakReference do
这个问题在这里已经有了答案: How can I wait for a thread to finish with .NET? (11 个答案) 关闭 3 年前。 我在标签点击事件中启动了一个线程。
我正在写一个函数 IsAlive采取IObservable , 和时间跨度,并返回 IObservable规范用例是检测流服务器是否仍在发送数据。 我为此提出了以下解决方案,但觉得它的工作原理并不是最
我开始知道下面的代码输出为 false ,但是当我们看到这个 Thread 实例时,我们创建的 thread 被设置为守护进程并且仍在运行,那么为什么方法调用 thread.isAlive() 会返回
有一个名为r1的可运行方法 Runnable r1=new Runnable(){ @Override public void run(){ //some code here
我有一些java脚本来检查小程序是否在加载页面的其余部分之前完成加载。它已经工作了很多年,现在似乎在 Firefox 16 和 IE 7 中失败。它在 IE 8 中工作 关于它为何损坏以及如何修复它有
如果我遍历 Weakreference 列表,在通过 _ref.IsAlive 验证后,我如何确定该引用仍然存在? 例如我有这段代码,其中 scopeReferences 是 Weakreferenc
这个问题已经有答案了: Why does an IllegalThreadStateException occur when Thread.start is called again (7 个回答)
我有两个按钮,当用户单击第一个按钮时,它将启动一个线程来更新 UI,当用户单击第二个按钮时,应用程序将为第一个线程设置一个 boolean 变量以不允许它更新线程,然后它将启动第二个线程。这是我的 R
为什么 isAlive() 方法在 Thread.java 中被声明为 native?哪个类实现了这个?我知道 native 方法是在 Java 之外实现的。实现它的类是通过加载相应的库来加载的。但是
我是一名优秀的程序员,十分优秀!