【发布时间】:2017-09-03 13:29:27
【问题描述】:
下面给出的代码演示了在 java 多线程中使用 isAlive()...
我无法解释显示的输出序列。我期望的输出是 r1 r1 true true r2 r2
谁能帮我解决这个问题。
public class MyThread extends Thread
{
public void run()
{
System.out.println("r1 ");
try {
Thread.sleep(200);
}
catch(InterruptedException ie) { }
System.out.println("r2 ");
}
public static void main(String[] args)
{
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.start();
t2.start();
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
}
}
输出: r1 真的 真的 r1 r2 r2
【问题讨论】:
-
不,不应该。您正在启动 2 个线程,您的输出完全取决于调度和其他事情。如果您正在寻找特定的输出,则此代码不会给出它。它可以在您运行它的时间之间改变。
-
为什么你认为输出应该是你所期望的?
-
你还没有真正解释为什么你认为输出应该是你认为的那样。您最好查看 Oracle 提供的并发教程文档,然后在仍有不清楚的地方完善您的问题。 docs.oracle.com/javase/tutorial/essential/concurrency/…
-
这段代码没有确定性的输出:推理线程代码的最佳方法是考虑每一行代码(在每条汇编指令处)的上下文切换。你头脑中的推理应该总是问:如果上下文切换发生在当前指令中,会发生什么,如果没有发生,会发生什么。 t1.start() 并不意味着 t1 将只执行一次,即 t1 将在任何 cpu 上执行。 t1.start() 只是在内核中添加线程并推送到调度队列中,并不意味着线程会立即获得cpu执行。
标签: java multithreading