问题描述
classMyThreadimplementsRunnable{//实现Runnable接口publicvoidrun(){//覆写run()方法for(inti=0;i<3;i++){System.out.println(Thread.currentThread().getName()+"运行,i="+i);//取得当前线程的名字}}};publicclassThreadAliveDemo{publicstaticvoidmain(Stringargs[]){MyThreadmt=newMyThread();//实例化Runnable子类对象Threadt=newThread(mt,"线程");//实例化Thread对象System.out.println("线程开始执行之前-->"+t.isAlive());//判断是否启动t.start();//启动线程**********************************************System.out.println("线程开始执行之后-->"+t.isAlive());//判断是否启动for(inti=0;i<3;i++){System.out.println("main运行-->"+i);}//以下的输出结果不确定System.out.println("代码执行之后-->"+t.isAlive());//判断是否启动-----------------------------------------}};为什么“*************”之后的是否启动始终显示true?而“------------”之后的是否启动则不确定?还有为什么执行结果总是先出现:线程开始执行之前-->false线程开始执行之后---->true再执行run方法内的内容?
解决方案
解决方案二:
该回复于2014-06-10 08:59:50被版主删除
解决方案三:
System.out.println("线程开始执行之前-->"+t.isAlive());//判断是否启动先执行,而且是确定的。当t.start()启动一个线程后,后面的执行顺序就都不确定了,可以在t.start()后面暂停一秒试试看。
解决方案四:
main是一个线程,Threadt=newThread(mt,"线程");线程的创建和启动、占用资源都是需要时间的。而你的main线程已经在运行,所以你看到的是main先运行,其实他们是同步运行的,如果main有耗时操作的话,你看的打印出的顺序就不一定了。
解决方案五:
如果在//以下的输出结果不确定System.out.println("代码执行之后-->"+t.isAlive());之前增加Thread.sleep(1000);看到的就有可能是FALSE了。
解决方案六:
解决方案七:
1.一个线程在调用了start以后(并且这个线程还没有die之前),isAlive就是true了所以你的第一个*************之后的第一个输出会是true2.在t.start()以后,这个线程就开始和main线程一起竞争cpu资源了,看看谁抢先执行!情况一:如果main线程抢到资源,那么就会执行System.out.println("线程开始执行之后-->"+t.isAlive());接着t线程抢到资源,执行t线程里的System.out.println(Thread.currentThread().getName()+"运行,i="+i);情况二:但是注意,此时t也可能先抢到资源,那么甚至可以出现可能让你惊讶的结果,先执行了t线程的System.out.println(Thread.currentThread().getName()+"运行,i="+i);然后再抢资源,这时候也许main线程抢到了资源,那么会执行main的System.out.println("线程开始执行之后-->"+t.isAlive());3.for循环里的情况也类似,总之在你没加锁的情况下,线程的执行先后顺序是不确定的!4.如果你想保证,t先执行完毕,main再执行,那么可以用join(让t线程插入到mian线程之前执行)就好比,你正在做1件事情,突然来了紧急的事情(来了个电话),那么就会先让接电话这个线程先执行,一直到挂机,再接着执行你原来的事情(main线程)可以在t.start()后面加上t.join();
解决方案八:
接着6楼补充,//以下的输出结果不确定System.out.println("代码执行之后-->"+t.isAlive());//判断是否启动-----------------------------------------你的这个代码不确定,是因为:main执行了这句以后,你的t线程还没在执行完(当然isAlive就是true)除非你保证,在打印这句之前,t必须执行完毕!(那么可以用join来保证)
解决方案九:
引用4楼commanager的回复:
如果在//以下的输出结果不确定System.out.println("代码执行之后-->"+t.isAlive());之前增加Thread.sleep(1000);看到的就有可能是FALSE了。
一看发帖时间,尿了,原来这帖是坟!
解决方案十:
1.main所在的线程结束,和其它子线程是否结束没有任何关系。2.main所在的线程结束,demon线程是否退出也和它没有任何关系,而是看整个jvm进程内是否还有非demon线程,如果没有,整个jvm进程退出。换句话说jvm只要发现不再有非demon线程就退出,main线程是否退出没有任何关系。
解决方案十一:
start()方法之后线程是可运行的,但是未必被运行.
解决方案十二:
找到答案了,谢谢大家