繁体   English   中英

Java在启动新线程之前会自动等待线程完成

[英]Java automatically waits for thread to finish before starting a new one

使用以下代码:

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 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10

而我的输出应如下所示:

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 Standard / SDK版本:Kepler版本
内部版本号:20130614-0229,jre7u25和jdk7u25。

这是你的问题:

    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循环内部 ,看看会发生什么。

第一个输出是正确的,并且您期望的也是正确的。 一百万次尝试中的概率为1。

虽然有多个线程,但是您不能以让任何特定线程有机会运行为己任。 一旦调度到jvm(如果是本机程序,则分配给CPU),它取决于jvm如何以及何时运行什么线程。

第一个输出是正确的bcz,代码是如此之小,以至于在线程需要切换之前,它就已经完成了任务。 这就是为什么不干预输出的原因。 也许您可以尝试更大的迭代次数,例如>10000这样您就可以理解这个概念。 或者您可以尝试运行代码多次。 您可能(可能)从同一代码获得不同的输出。

附言:sleep作为最后一条指令,实际上没有任何作用,因为线程几乎已经耗尽了生命,而您只是在等待死亡。

如果两个线程具有相同的优先级,则不能保证执行顺序(两次运行同一程序可能会产生不同的结果),并且它取决于托管的操作系统,因为它的工作是在线程之间分配CPU。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM