Java中线程的执行顺序

Java中线程的执行顺序,java,multithreading,Java,Multithreading,我怀疑java中线程的执行顺序。 这个例子 public class Thr implements Runnable { String string = "Yes "; public void run(){ this.string = "No "; } public static void main (String args[]){ Thr t = new Thr(); new Thread(t).start();

我怀疑java中线程的执行顺序。 这个例子

  public class Thr implements Runnable {
    String string = "Yes ";
    public void run(){
      this.string = "No ";
    }
    public static void main (String args[]){
      Thr t = new Thr();
      new Thread(t).start();
      for(int i = 0; i < 10; i++)
          System.out.println(t.string);
    } 
  }
我对这个话题很感兴趣 我不明白为什么在第一次通过for循环后字符串会变为no。 我认为,由于主线程没有大的任务要做,主线程将首先执行,输出将是

Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes
No

当我在run方法中放入一些print而不是this.string=“No”时,print from run方法将最后打印。

处理线程时,请确保一件事,即使调用以下命令,也无法预测线程何时启动:

new Thread(t).start();

当您调用它时,线程进入“准备开始运行或可运行状态”,然后线程调度程序可以根据需要将线程置于运行状态,这有点复杂,但您无法预测当您有一组线程时会发生什么,有时如果启动两个线程,最后一个线程将首先运行。要了解更多关于这个主题的信息,请参见

,我想我已经了解了发生的事情。问题是,这个线程、主线程和新线程(t)都是并行执行的。这是一种抽签,因为它们都会请求处理器时间,所以,当主线程开始执行它需要执行的所有代码时,主线程花费处理器时间,它只打印第一个是,然后新线程(t)得到处理器时间,将“是”改为“否”,然后完成执行,然后,主线程再次继续执行。我做了一个小测试,结果

public class Thr implements Runnable {
  String string = "Yes ";
  public void run(){
    this.string = "No ";
  }
  public static void main (String args[]){
  Thr t = new Thr();
  Thread tr = new Thread(t);
  tr.start();
  for(int i = 0; i < 10; i++)
      System.out.println(t.string + tr.isAlive());
  } 
}

是的,但我认为,由于主线程没有太多的任务,将使用Yes执行firs for循环,然后执行新线程(t).start(),所以它将是肯定的,在最后,当我把,例如,在运行System.out.println(“线程”)和在主系统中的for循环中运行System.out.println(“主”),程序打印字符串线程,线程在末端独立运行。没有明确的顺序,很可能会发生你所期望的事情。但是,如果你依赖于此,那就太幸运了。除了争用问题(指令的相对执行顺序)之外,这段代码还存在可见性问题(何时写入
字符串
变量对主线程可见)。所以,是的,实际上这里什么都可能发生。我知道这一点,但我只是不明白为什么在运行中使用这个。string=“no”时,它只在第一次迭代后才更改,而对于所有其他操作,它首先执行主线程一段时间。。。即使我进行了5000次迭代,在第一次迭代后它仍然会从yes变为no。JVM是否可能执行得更快一些,因为它不包含很多工作要做?您唯一能知道的是,它没有指定将发生什么。编写任何依赖于以特定顺序执行的线程的代码,或者一个线程在另一个线程之前执行,而没有特定的同步调用,都会在某个点上失败。我也很痛苦地意识到了这一点:D,但这是我的java考试示例,因此我无法避免:)是的,玩线程很酷,尝试打印值,然后花很少的时间等待,看看会发生什么:)
public class Thr implements Runnable {
  String string = "Yes ";
  public void run(){
    this.string = "No ";
  }
  public static void main (String args[]){
  Thr t = new Thr();
  Thread tr = new Thread(t);
  tr.start();
  for(int i = 0; i < 10; i++)
      System.out.println(t.string + tr.isAlive());
  } 
}
Yes true
No false
No false
No false
No false
No false
No false
No false
No false
No false