class MyThread implements Runnable // 实现Runable接口
{
public void run() //重写run()方法
{
for(int i=0;i<3;i++)
{
System.out.println(Thread.currentThread().getName()+"运行,i="+i);
}
}
}
public class CurrentThreadDemo
{
public static void main(String args[])
{
        MyThread a=new MyThread(); //创建对象
    new Thread(a,"张三").start(); //启动线程
        a.run();  //运行的是Main的线程

}

}
我想问为什么继承Runable接口的类a的线程与a.run()调用的主方法的线程抢CPU,前者抢不过后者。???明明先执行的start()执行起来。。却在main()方法的后面请各位大哥帮忙助呀!!!

解决方案 »

  1.   

    虽然先执行的是“new Thread(a,"张三").start(); //启动线程”,但是这句执行了后,这个“张三”的线程就由jvm来调度了,先是进入就绪状态,等待jvm调度运行。这个通常都慢于主线程(紧接着的语句)的运行。
    楼主可以让主线程在“张三”start()后,休眠一会儿,Thread.sleep(n); n 选几个数比如,1,2,5,10,20,分别运行,再观察结果。
      

  2.   

    主线程 优先于 其他线程 sleep 他还没学到吧?
      

  3.   

    线程常用操作方法start //启动线程
    interrupt //强制终止线程
    setName //设置线程名称
    getName //取得线程名称
    currentThread //当前线程
    isAlive //线程状态
    sleep //线程休眠
    join //强制运行该线程
    MAX_PRIORITY  MIN_PRIORITY  NORM_PRIORITY //线程的优先级
    synchronized 同步操作 // 线程有2种启动方式 
    实现Runnable 接口 和 继承 Thread 类
    通常情况下 一般使用继承接口 
    因为接口可以被 多实现
    并且 实现接口 可以共享资源  使程序更安全 更健壮 
     
    希望对楼主学习线程 有帮助
      

  4.   

    +1,启动线程需要花费时间,主线程继续往下进行,所以main先执行了。start之后主线程sleep一下即可。
      

  5.   

    额原来是这样子呀、、受教了。。那我想问一下为什么线程对象可以多次调用run()方法,而不可以多次调用start()方法,执行start()方法不是调用了run()方法吗。。为什么这样操作不会报错了。???
      

  6.   

    start会调用run,但不是简单的调用,有现成状态的转换在里面的直接调用run就是普通的方法调用
      

  7.   

    学习了,想过是由于优先级的问题,不过不知道的这么清楚,是jvm的机制问题,一楼的很好咯。
      

  8.   


    这个可以试试看,然后我想说的是线程是有优先权的,跟具体的调用过程有关,还有主线程永远是优先于其他线程的,这个意思是如果线程被kill掉 ,主线程是最后一个beikill的