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

关于多线程的一点问题
因为刚学习java不久,对于多线程有一点不解,就是如果各个线程的优先级如果一样的话(包括主线程),那么如果主线程和其他线程同时为就绪状态,当然此时有一个线程在运行,当这个线程处于阻塞状态时,究竟是主线程还是其他线程成为运行状态?下面有一段代码,为何主线程不能在当前线程处于阻塞状态时开始运行,而一定要等待两个线程运行结束,主线程睡眠时间无论多少都会等待其他线程运行结束吗,为什么会是这样?如果不想让主线程等待的话该怎样做呢,请各位指点
package occupycpu;
public class Machine extends Thread{
  private static StringBuffer log=new StringBuffer();
  private static int count=0;

  public void run(){
  for(int a=0;a<20;a++){
  log.append(currentThread().getName()+":"+a+" ");
  if(++count %10==0)log.append("\n");
  try{
  sleep(100);
  }catch(InterruptedException e){
  throw new RuntimeException(e);
  }
  }
  }
  public static void main(String args[])throws Exception{
  Machine machine1=new Machine();
  Machine machine2=new Machine();
  machine1.setName("m1");
  machine2.setName("m2");
  machine1.start();
  machine2.start();
  while(machine1.isAlive() || machine2.isAlive())
  Thread.sleep(5); //主线程睡眠5秒,等待machine1和machine2线程运行结束
  System.out.println(log);
  }
}

------解决方案--------------------
其实多线程也是同一时间只有一个线程在运行
只不过是利用空闲时间切换运行提高效率的
真正意义的多线程是需要硬件支撑的
------解决方案--------------------
machine1和machine2的线程状态并不是受到其它线程的影响的,除了正在sleep时状态为TIMED_WAITING外,for循环中状态为RUNNABLE的,也就是machine1和machine2可以同时处于RUNNABLE的,JVM是为自动为多个RUNNABLE的线程作调度的。



上述代码上,如果不想在main中使用while循环可以使用machine1.join();mainchine2.join()这样来直接等待两个线程的结束
------解决方案--------------------
使用sychronized标记的话,它只是为了资源的互斥使用,并不能锁定线程啊!!!
我想用调用yeild()方法应该行的。

——————————————————————继续探讨,我也是初学者