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

多线程求教!
我拷贝了   《java   2   参考大全》上的一段源代码,我对其中的运行不是很理解,现在先把程序列在下面。

public   class   NewThread   implements   Runnable{

Thread   t;

NewThread(){
t   =   new   Thread(this, "Demo   Thread ");
System.out.println( "child   thread:   "+   t);
t.start();
}

public   void   run(){
try{
for(int   i=5;i> 0;i--)
{
System.out.println( "child   Thread:   "+i);
Thread.sleep(500);

}

}catch(InterruptedException   e){

System.out.println( "child   thread   interrupted ");

}
System.out.println( "child   thread   exited ");
}
}


主程序如下:
public   class   ThreadDemo   {

/**
  *   @method_name   main
  *   @author   xddiao@cattsoft.com
  *   @date   2007-6-14   下午02:55:59
  *   @description  
  *   @param   args  
  *   @reviewed_by
  */
public   static   void   main(String[]   args)   {
//   TODO   自动生成方法存根
new   NewThread();
try{
for(int   i=5;i> 0;i--)
{
System.out.println( "main   thread: "+i);
Thread.sleep(1000);
}
}catch(InterruptedException   e){
System.out.println( "main   thread   interrupted. ");

}
System.out.println( "main   thread   exited! ");

}

}


这个程序的执行结果如下:
child   thread:   Thread[Demo   Thread,5,main]
main   thread:5
child   Thread:   5
child   Thread:   4
main   thread:4
child   Thread:   3
child   Thread:   2
main   thread:3
child   Thread:   1
child   thread   exited
main   thread:2
main   thread:1
main   thread   exited!

我不明白的地方是:
为何子线程在输出child   thread:   Thread[Demo   Thread,5,main]   之后,就马上切换回主线程呢   ?t.start()不是调用了t.run()吗,为何不等到t.run()执行完毕才执行主线程呢?这是什么原因?这个切换是怎么规定的呢?
我略微写一下思路:
start(){
      this.run();
}

这个问得比较深了,   运行时,凭什么不把start后大括号内的程序运行完才跳出start呢,   这个是怎么实现的?不能说就是线程机制,到底线程机制是怎么实现的呢?  
先在这里谢过各位的解答!   等待中。。。。


------解决方案--------------------
就是因为项达到分开运行的效果才要线呈的。

这就是线程的目的。

怎么实现的应该问sun去。外部程序实现的
------解决方案--------------------
线程就是并发
JAVA的线程是抢占式的
如果你把this.start()改成this.run()的话,那就意味着此时不是开启一个线程,而是对run()方法的一个调用

------解决方案--------------------
start()不是直接调用run()的,而是启动一个线程,然后在线程里运行run()作为线程的执行体。这个输出不是一定的,多运行几次,会有不同的结果。
Thread.sleep()会使线程睡眠,从而交出CPU使用权,如果某个线程一直不使用sleep()……后果比较严重,jvm会很难找到把CPU使用权交给其他线程的机会。