0

这是我的代码

public class ThreadLearn{
private static class Check implements Runnable{
    public void run(){

        System.out.printf("\nInCheck %s", Thread.currentThread().getName());
    }
}

public static void main(String[] args){

   Thread t;
   int i=0;
   while(i<2){
      t = new Thread(new GetData());
      t.start();
      System.out.printf("\n%s: ", t.getName());
      i++;
   }

}

}

输出是:

InRun Thread-0
Thread-0:
Thread-1:
InRun Thread-1

我有两个问题:

  1. 输出不应该是

    InRun 线程-0

    线程-0:

    InRun 线程 1

    线程 1:

  2. 一旦t.start()完成,它会等待run()执行然后创建第二个线程吗?如果我想做以下事情怎么办

    同时(必填)

    新线程().start();

在我的运行方法中,我可以拥有我希望线程并行完成的所有内容,这样它就不会等待一个线程完成运行方法然后创建第二个线程。

谢谢

4

3 回答 3

6

输出不应该是......

不,线程彼此独立运行。JVM 和操作系统决定何时运行哪个线程。一般来说,两个线程的执行顺序是不可预知的。当您再次运行程序时,很可能会发生不同的结果。

一旦t.start()完成,它会等待run()执行然后创建第二个线程吗?

不,它不会等待。新线程的run()方法可能立即启动,也可能稍后启动,具体取决于线程的调度方式。

于 2012-08-24T07:22:33.610 回答
1

当线程启动时,它就启动了。所以这两个 System.out 几乎同时执行,导致它们有时会改变顺序

例子:

            ---- thread-0 prints out  
Main thread |--- Prints out ----------- Prints out
                                      |Thread-1 started, prints out

如您所见,分支将与主代码大致同时运行,导致它们在实际首先打印出来的时间之间波动

于 2012-08-24T07:23:42.707 回答
0

由于您没有提供任何同步机制,因此无法确定先执行哪个线程;在不同的运行中,可能还有其他顺序。

于 2012-08-24T07:23:20.373 回答