运行与线程相关的java代码时的随机结果

时间:2016-10-15 15:34:45

标签: java xcode multithreading concurrency

在运行以下代码时,随机结果即将发布。随机结果如下:

  • 当我运行代码时,第一个出现的结果是

    B = 1,B = 2,B = 3,B = 4,B = 5,退出B,A = 1,A = 2,A = 3,A = 4,A = 5,退出A

  • 下次

    B = 1,B = 2,A = 1,A = 2,A = 3,A = 4,A = 5,B = 3,B = 4,A = 5,从B出口,从A出口。

为什么?

class A extends Thread

{

 public void run()

 {

  for(int i=1;i<=5;i++)

  {


   if(i==3) yield();

   System.out.println("A="+i);

  }

  System.out.println("Exit from A");

 }

}

class B extends Thread

{

 public void run()

 {

  for(int j=1;j<=5;j++)

  {

   System.out.println("B="+j);

  }

  System.out.println("Exit from B");

 }

}

class T 

{

 public static void main(String args[])

 {

  A obj1=new A();

  B obj2=new B();


  obj1.start();

  obj2.start();    

 }

}

2 个答案:

答案 0 :(得分:0)

您无法保证执行的顺序。调用start()并不意味着会立即调用run(),它会在选择运行你的线程时依赖于线程调度程序。

您根本不使用同步,因此您永远不知道哪个线程拦截执行。

答案 1 :(得分:0)

您没有在线程同步上使用任何控件(锁,信号量,障碍等)。所以基本上你不能指望任何明确的代码输出。

你永远无法猜测一组自由运行的线程的执行顺序。它几乎取决于

  • 操作系统如何处理系统级线程执行(Windows,Linux,Unix具有不同的机制)。
  • 您的硬件底层(单核与多核,超线程等)。
  • 主要是执行程序时系统的状态(程序执行时其他进程如何利用系统)。

从您的代码中,我认为您正在尝试以yield();的方式进行实验。而且您的代码不会给您任何支持。可悲的是,你正在尝试的代码对你没有帮助。 This问题为此目的提供了3,4个好的答案和示例。 :))