java多线程中的isAlive()执行

java多线程中的isAlive()执行,java,multithreading,Java,Multithreading,下面给出的代码演示了在java多线程中使用isAlive。。。 我无法解释显示的输出序列。我期望的输出是r1r1真r2真r2 有人能帮我吗 public class MyThread extends Thread { public void run() { System.out.println("r1 "); try { Thread.sleep(200); } catch(Inter

下面给出的代码演示了在java多线程中使用isAlive。。。 我无法解释显示的输出序列。我期望的输出是r1r1真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

输出

r1
true 
true 
r1 
r2 
r2
如果两个线程都在运行,但其中一个可能但不确定第二个线程已开始运行,但尚未到达System.out.printlnr1,则这是完全合理的

没有进一步的同步结构,这是竞争条件的简单示例

竞态条件或竞态危险是指电子设备的行为, 软件或其他系统,其输出取决于 其他不可控事件的顺序或时间安排


注意:System.out作为实例的PrintStream不能保证线程安全,因此至少在理论上可能会出现丢失一些打印的结果。

不应该。您将启动两个线程,并且您的输出完全取决于调度和其他事项。如果您正在寻找特定的输出,此代码将不会给出它。它可以在您运行它的时间之间改变。为什么您认为输出应该是您期望的?您还没有真正解释为什么您认为输出应该是您认为应该是的。您最好先查看Oracle提供的并发教程文档,然后在某些地方仍然不清楚的情况下完善您的问题。此代码段没有确定的输出:对线程化代码进行推理的最佳方法是在每一条汇编指令的每一行代码上考虑上下文切换。你头脑中的推理应该总是问:如果在当前指令中发生上下文切换,会发生什么,如果不会发生,会发生什么。t1.start并不意味着t1将立即执行,即t1将在任何cpu上执行。t1.start只需在内核中添加线程并将其推送到调度队列中,这并不意味着线程将立即获得cpu以执行。System.out似乎是线程安全的,我不明白最后一段的要点。@Nathanhues它确实是。但是我找不到任何保证。是的,这只是错误的信息,println及其变体是线程安全的,您永远不会从不同的调用中得到混合输出。public void printlnString x{synchronized this{printx;newLine;}}@JarrodRoberson是在不查看源代码的情况下记录的吗?我找不到任何声明。@Jarroderson什么?绝对不是。JavaAPI文档,语言参考,这些都是确定的文档。您所看到的任何Java实现的源代码都不是。