如何预测输出中的线程ID?

时间:2014-01-14 12:17:59

标签: java multithreading

以下是OCJP考试的代码

class Test implements Runnable{

  synchronized void hit(long n) {
     for(int i = 1; i < 3; i++)
        System.out.print(n + "-" + i + " ");
  }

  public static void main(String... args) throws Exception{   
     new Thread(new Test()).start();
     new Thread(new Test()).start();
  }

  @Override
  public void run() {
     hit(Thread.currentThread().getId());
  }
}
  

答案:8-1 7-1 7-2 8-2和

     

8-1 8-2 7-1 7-2

如何预测此输出?

2 个答案:

答案 0 :(得分:8)

你无法预测它。线程并行运行,输出顺序在线程之间有效随机,尽管每个线程的顺序都是确定的。

synchronized on hit()也没有做任何事情,因为每个线程都有自己的Test对象,因此只与自身同步。

换句话说,8-2将始终跟随8-1。 7-2将始终遵循7-1,但所有7s的顺序与所有8s的顺序完全分开。这意味着给定一组可能的输出,你可以说有些是不可能的,有些是可能的,你无法预测会产生什么样的实际输出。

你也应该阅读这个问题及其答案,这个主题非常有用:

How do you think through and predict the output of a threading question like this?

答案 1 :(得分:1)

你无法预测它,但是你可以用某种计数器自己设置Thread的名字(如果这对你来说意味着什么)。

Thread myThread = new Test();
myThread.setName(counter++);