public  class  MyThread  extends  Thread  {  
           private  int  i=5;  
           MyThread()  {  
                       start();  
           }  
 
           public  void  run()  {  
                       while  (true)  {  
                                   System.out.println(this);  
                                   if  (--i==0)            {  
                                               return;  
                                   }  
                       }  
           }  
 
           public  static  void  main(String[]  args)  {  
                       for  (int  i=0;i<5  ;i++  )            {  
                                   new  MyThread();  
                       }  
                       System.out.println("end");  
           }  
};  
1.这个for循环中当生成第一个线程实例(并同时调用了start())时,此时会不会立即调用run()?还是应该经过线程调度机制当被CPU选中才执行run()?  如果是:  
 
2.for中第二个线程实例的生成是否跟第一个线程实例的执行有关?还是不顾前一个线程是否被CPU调用都会自动生成(此时也不一定会被选中调用run())?  
3.println("end")这句是否因为在主线程中所以会与前五个线程并发执行?或者说main线程只负责创建线程,所以一但创建完成就会不顾它们是否被CPU选中也会执行这个输出语句?

解决方案 »

  1.   

    1.要经过线程调度
    2.没测试出来,我想不会顾前一线程
    3.不顾它们是否被CPU选中也会执行这个输出语句
      

  2.   

    1、不会,程序都没有运行到RUN函数。还是应该经过线程调度机制当被CPU选中才执行run()?   这是什么意思啊!?
    2、在同一个时间片中肯定会阻塞的。但实际上,在一个时间周期之内,他是循环创建的,不会阻塞!
    3、对我们来说是并发的。“被CPU选中”是什么意思?搞不清白!
      

  3.   

    这个问题,关系到CPU的时间片时间周期。
    楼主说的“被CPU选中”应该是指被CPU的一个时间片选中吧。1。要经过线程调度(调用了start(),run()不一定马上运行);2。与第一个线程没有关系,只不过第二次线程要运行中,第一个线程肯定是等待状态(针对CPU时间片来说)。3。其它线程如果正在运行,println("end")肯定是不会输出的。除了println("end")抢到CPU资源。
      

  4.   

    1同意所有楼上
    2新的线程产生以后应该是被加入到就绪进程队列,然后等待分配cpu资源,轮到哪个哪个执行,各线程之间没关系.
    3这个例子中main线程应该会等到其它的线程都运行完之后才会结束吧.