黑马程序员技术交流社区

标题: 多线程执行顺序小问题,求指教? [打印本页]

作者: 想飞的鱼    时间: 2014-5-7 11:48
标题: 多线程执行顺序小问题,求指教?
  1. class ThreadDemo1
  2. {
  3.         public static void main(String [] args)
  4.         {
  5.                 new TestThread().start();//run();
  6.                 for (int x=0;x<5 ;x++ )
  7.                 {
  8.                         System.out.println("main thread is running");
  9.                 }
  10.                 /*while (true)
  11.                 {
  12.                         System.out.println("main thread is running");
  13.                 }
  14.                 */
  15.         }
  16. }
  17. class TestThread extends Thread
  18. {
  19.         public void run()
  20.         {
  21.                 for (int x=0;x<5;x++ )
  22.                 {
  23.                         System.out.println(Thread.currentThread().getName()+" is running");
  24.                 }
  25.                 /*while (true)
  26.                 {
  27.                         System.out.println(Thread.currentThread().getName()+" is running");
  28.                 }
  29.                 */
  30.         }
  31. }
  32. /*
  33. 输出结果:
  34. main thread is running
  35. main thread is running
  36. main thread is running
  37. main thread is running
  38. main thread is running
  39. Thread-0 is running
  40. Thread-0 is running
  41. Thread-0 is running
  42. Thread-0 is running
  43. Thread-0 is running

  44. 为什么先输出main thread is running,明明先调用的new TestThread.start()方法啊
  45. 求高人指教!!!
  46. */
复制代码



作者: 刘晶    时间: 2014-5-7 12:02
  1. class ThreadDemo1
  2. {
  3.         public static void main(String [] args)
  4.         {
  5.                 new TestThread().start();          //run();<font color="#ff0000">这里已经开启了一个线程,主函数本来就是一个线程,相当于你一共开启了两个线程,</font>
复制代码

作者: 刘晶    时间: 2014-5-7 12:07
class ThreadDemo1
{
        public static void main(String [] args)
        {
                new TestThread().start();//run();这里已经开启了一个线程,主函数本来就是一个线程,相当于你一共开启了两个线程,如果把for循环变大点就会看见两个线程交替执行
                for (int x=0;x<5 ;x++ )// for (int x=0;x<60 ;x++ )
                {
                        System.out.println("main thread is running");
                }
                /*while (true)
                {
                        System.out.println("main thread is running");
                }
                */
        }
}
class TestThread extends Thread
{
        public void run()
        {
                for (int x=0;x<5;x++ )//for (int x=0;x<60 ;x++ )
                {
                        System.out.println(Thread.currentThread().getName()+" is running");
                }
                /*while (true)
                {
                        System.out.println(Thread.currentThread().getName()+" is running");
                }
                */
        }
}
/*
输出结果:
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
Thread-0 is running
Thread-0 is running
Thread-0 is running
Thread-0 is running
Thread-0 is running

为什么先输出main thread is running,明明先调用的new TestThread.start()方法啊
求高人指教!!!
*/

作者: 王春蕾    时间: 2014-5-7 12:12
程序中总共有两个线程,main和Thread-0线程,现输出main thread is running不一定等于先开启main线程,还与CPU的执行权和执行资格有关系。其实每个程序是看定先执行main线程的,因为他是程序的主入口,JVM调用静态的main方法时就已经开启了main线程。你的输出结果是因为CPU的执行权的切换导致的。不知道楼主有没有明白呢?
作者: 张耀扬    时间: 2014-5-7 12:14
本帖最后由 张耀扬 于 2014-5-7 12:15 编辑

多线程执行时,程序不一定按顺序执行啊,谁抢到cpu资源,谁就执行, 我main里的循环次数改成100, run方法里的循环次数改成1,多试几次,可以看到如下结果啊
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
Thread-0 is running      
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running
main thread is running

.
.
.

作者: 想飞的鱼    时间: 2014-5-7 12:14
刘晶 发表于 2014-5-7 12:07
class ThreadDemo1
{
        public static void main(String [] args)

主函数相当于一个线程,也就是说任何程序在执行的时候第一个执行的线程就是main那个线程吗?那这个第一个为什么不是Thread-0线程我就懂了,谢谢。
作者: wanghe826    时间: 2014-5-7 13:00
主线程也是线程,谁先执行都有可能
作者: 邵景伦    时间: 2014-5-7 13:33
class ThreadDemo1//Java虚拟机加载类的字节码文件
{
        public static void main(String [] args)//找到主方法,开启主线程
        {
                new TestThread().start();//run();//创建线程并开启,这个线程为就绪状态,等待cpu分配执行权。cpu分配执行权是随机分配的,所以结果不确定。可以加入sleep();语句,让出执行权
                for (int x=0;x<5 ;x++ )
                {
                        System.out.println("main thread is running");
                }
                /*while (true)
                {
                        System.out.println("main thread is running");
                }
                */
        }
}
class TestThread extends Thread
{
        public void run()
        {
                for (int x=0;x<5;x++ )
                {
                        System.out.println(Thread.currentThread().getName()+" is running");
                }
                /*while (true)
                {
                        System.out.println(Thread.currentThread().getName()+" is running");
                }
                */
        }
}
作者: 远行的人2号    时间: 2014-5-7 14:17
我也遇到过类似问题,现在懂了
作者: 倪大大    时间: 2014-5-7 14:37
你在主函数中调用TestThread.start()就是开启这个线程,加上你的主线程 也就是MAIN方法,一共存活的是两个线程,学了多线程你应该知道,这时候他们应该是并行的,也就是谁抢到CPU执行权谁就执行.
  现在CPU已经很快,你的for循环太短,导致其中一个线程抢到CPU只需要一瞬间就可以完成,所以你把for控制数调大一点,就能看到这两个线程是在交叉执行的了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2