Java会自动等待线程完成,然后再启动新线程

Java会自动等待线程完成,然后再启动新线程,java,eclipse,multithreading,output,Java,Eclipse,Multithreading,Output,使用以下代码: package myapp; class Runner extends Thread { public void run(){ for(int i = 0; i < 11; i++){ System.out.println("Hello " + i); } try { Thread.sleep(100); } catch (InterruptedExc

使用以下代码:

package myapp;

class Runner extends Thread {
    public void run(){
        for(int i = 0; i < 11; i++){
            System.out.println("Hello " + i);
        }

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public class Class1 {
    public static void main(String[] args){
        Runner t1 = new Runner();
        t1.start();

        Runner t2 = new Runner();
        t2.start();
    }
}
鉴于我的输出应如下所示:

Hello 0
Hello 0
Hello 1
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 4
Hello 4
Hello 5
Hello 5
Hello 6
Hello 6
Hello 7
Hello 7
Hello 8
Hello 8
Hello 9
Hello 9
Hello 10
Hello 10

怎么了?我使用的是Eclipse标准/SDK版本:开普勒发布版本构建id:20130614-0229、jre7u25和jdk7u25。

第一个输出是正确的,您期望的也是正确的。概率是百万分之一

虽然有多个线程,但您无法预测是否有机会运行任何特定线程。在本机程序中,一旦被分派到jvm或CPU,它就应该在jvm上如何以及何时运行哪个线程

第一个输出是正确的bcz,代码非常小,甚至在线程需要切换之前,它就已经完成了任务。这就是为什么输出没有被干预。也许你可以尝试更多的迭代次数,比如说>10000次,这样你就可以理解这个概念。或者您可以尝试运行代码多次。您可能会从同一代码中获得不同的输出


Ps:保持睡眠作为最后一条指令,实际上没有任何效果,因为线程几乎已经结束了它的生命,而您只是让它等待死亡。

第一次输出是正确的,您期望的也是正确的。概率是百万分之一

虽然有多个线程,但您无法预测是否有机会运行任何特定线程。在本机程序中,一旦被分派到jvm或CPU,它就应该在jvm上如何以及何时运行哪个线程

第一个输出是正确的bcz,代码非常小,甚至在线程需要切换之前,它就已经完成了任务。这就是为什么输出没有被干预。也许你可以尝试更多的迭代次数,比如说>10000次,这样你就可以理解这个概念。或者您可以尝试运行代码多次。您可能会从同一代码中获得不同的输出


Ps:将睡眠作为最后一条指令,实际上没有任何效果,因为线程几乎已经结束了它的生命,而您只是让它等待死亡。

如果两个线程具有相同的优先级,执行顺序不能保证两次运行同一程序可能会产生不同的结果,这取决于托管的操作系统,因为它的任务是在线程之间调度CPU。

如果两个线程具有相同的优先级,因此,不能保证执行顺序两次运行同一程序可能会产生不同的结果,这取决于托管的操作系统,因为它的任务是在线程之间调度CPU。

这是您的问题:

    for(int i = 0; i < 11; i++){
        System.out.println("Hello " + i);
    }

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
你先跑完整个循环,然后才睡觉。将睡眠移动到for循环中,看看会发生什么。

这是您的问题:

    for(int i = 0; i < 11; i++){
        System.out.println("Hello " + i);
    }

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

你先跑完整个循环,然后才睡觉。将休眠移到for循环中,看看会发生什么。

为什么您认为它应该以第二种方式打印?因为我没有使用join,而且它与示例中的代码完全相同。您的期望不正确,输出顺序被认为是未定义的,不应期望以任何特定的顺序打印。为什么您认为它应该以第二种方式打印?因为我没有使用join,并且因为它与示例中的代码完全相同。您的期望不正确,输出顺序被认为是未定义的,不应该期望以任何特定的顺序输出。这就是我一直在寻找的。非常感谢你!这就是我要找的。非常感谢你!