2017-09-03 140 views
-3

下面给出的代码演示了Java多线程中isAlive()的使用... 我无法解释输出序列的显示效果。我期望的输出是r1 r1 true true r2 r2
任何人都可以帮我解决这个问题。isAlive()在java多线程中执行

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

+4

不,它不应该。你开始2线程和你的输出完全取决于调度和其他事情。如果你正在寻找一个特定的输出,这段代码不会给它。它可以在你运行它的时间之间改变。 – Kayaman

+0

为什么你认为输出应该是你期望的? –

+0

你没有真正解释为什么你认为输出应该是你认为应该是的。您最好审阅Oracle提供的并发教程文档,然后在问题仍不清楚的情况下完善您的问题。 https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html – pvg

回答

-2

输出

r1 
true 
true 
r1 
r2 
r2 

是完全合理的,如果两个线程正在运行,但他们中的一个(可能但不当然第二个)已经开始运行,但还没有达到System.out.println("r1")

没有进一步的同步结构,这是“竞争条件”的直接示例。

争用条件或种族的危害是电子的, 软件或其他系统,其中所述输出依赖于不可控制的其他事件的 序列或定时的行为。

https://en.wikipedia.org/wiki/Race_condition

NB:PrintStream(即System.out是一个实例)不能保证线程安全所以就像失去了一些打印结果至少在理论上是可能的。

+0

System.out似乎是线程安全的,我没有得到最后一段的要点。 –

+0

@NathanHughes它看起来确实如此。但我找不到任何保证。 – Persixty

+0

是的,这只是错误的信息,'println()'和它的变体是线程安全的,你永远不会得到不同调用的混合输出。 (x){ synchronized(this){ print(x); newLine(); } }' –