【问题标题】:Java automatically waits for thread to finish before starting a new oneJava 在开始一个新线程之前自动等待线程完成
【发布时间】:2013-08-03 18:23:33
【问题描述】:

使用以下代码:

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 标准/SDK 版本:Kepler Release
Build id:20130614-0229、jre7u25 和 jdk7u25。

【问题讨论】:

  • 为什么你认为它应该以第二种方式打印?
  • 因为我没有使用 join() ,因为它是示例中的确切代码。
  • 您的期望不正确,输出顺序被认为是未定义,并且永远不应期望以任何特定顺序。

标签: java eclipse multithreading output


【解决方案1】:

这是你的问题:

    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();
    }

您首先运行整个循环,然后才进入睡眠状态。将 sleep 移入 for 循环,看看会发生什么。

【讨论】:

  • 这就是我要找的。非常感谢!
【解决方案2】:

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

虽然有多个线程,但您无法预测任何特定线程都有机会运行。一旦被分派到 jvm(或本地程序的 CPU),它取决于 jvm 如何以及何时应该运行什么线程。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多