Java使线程同时启动

199*_*911 3 java multithreading

我在这里得到一个代码,当它运行时创建并启动一个新的线程,每秒打印一个单词,5秒后主方法停止线程.所以该程序将打印5个单词,它确实....但不是我的家用电脑只在我的笔记本电脑上.在我的家用电脑上打印6次,为什么?

public class Main {
  public static void main (String [] args){
    try {
      T1 t1 = new T1();
      System.out.println("Creating and staring thread 1\n");
      Thread.sleep(5000);
      t1.stopThread();
    } catch(InterruptedException ie) {}
  }
}

public class T1 extends Thread{

  private boolean alive = true;

  public T1(){
    start();
  }

  public void run(){
    while(alive){
      try {
        System.out.println("Tråd T1: Tråd 1");
        Thread.sleep(1000);
      } catch(InterruptedException ie) {}
    }
  }
  public void stopThread(){
    alive = false;
  }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 9

两个结果都是正确的.睡眠时间是近似值.

  • 看看那些是为了更好地理解.http://stackoverflow.com/questions/824110/accurate-sleep-for-java-on-windows - http://www.javatuning.com/why-is-thread-sleep-inherently-inaccurate/ (2认同)

tot*_*to2 9

你很幸运,你的程序完全停止打印.你有一个程序具有未定义的行为,它可以在某些机器上永远运行.您必须制作alive volatile,否则无法保证您的辅助线程将看到alive主线程中所做的更改.

查看关于内存的Java语言规范章节的结尾; 他们基本上把你的榜样作为一些不能做的事情.

话虽这么说,你可能仍然会得到6条打印线而不是5条不准确的线Thread.sleep.