日期:2014-05-20  浏览次数:20658 次

线程的一个小问题
public class TestThread {
public static void main(String args[]){
Runner r = new Runner();
  Thread t = new Thread(r);
  t.start();
  for(int i=0;i<100000;i++){
  if(i%10000==0 && i>0)
  System.out.println("in thread main i=" + i);
  }
  System.out.println("Thread main is over");
  r.shutDown();
  }
}

class Runner implements Runnable {
  private boolean flag=true;
  
public void run() {
int i = 0;
while (flag==true) {
System.out.print(" " + i++);
}
}

  public void shutDown() {
flag = false;
  }
}

很简单的一个小程序,用shutDown方法来停止线程,为什么运行结果后是在执行了System.out.println("Thread is over");后又执行了一遍falg==true时的System.out.print(" "+ i++);而不是立即停止整个程序呢?

------解决方案--------------------
两个线程,工作是异步的。
相同时间内,两个线程所执行的指令个数,也是不相同的;
并且,由于线程的当前环境差异,每次相同时间内执行的指令个数都未必相同。
所以,调用shutdown方法,是会停止runner线程,但是,未必是立即停止。
也就是说,调用shutdown方法后,有可能runner不执行循环体就结束了;
也有可能会执行一次循环体;当然,也有可能执行多次循环体才停下。