线程是否启动的问题

问题描述

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()方法之后线程是可运行的,但是未必被运行.
解决方案十二:
找到答案了,谢谢大家

时间: 2024-10-07 11:48:22

线程是否启动的问题的相关文章

详解Java多线程编程中线程的启动、中断或终止操作_java

线程启动: 1.start() 和 run()的区别说明start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用. run() : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明. class MyThread extends Thread{ public void run(){ ... } }; MyThread mythread = new

android-Android在UI线程中启动新线程复制文件,为什么还会使界面延迟

问题描述 Android在UI线程中启动新线程复制文件,为什么还会使界面延迟 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // 把sql文件写入sd卡,然后把路径给so String mPath=""; if(android.os.Environment.getExternalStorageState().equals("mounted

Android Input子系统:Input进程的创建,监听线程的启动

本文讲的是Android Input子系统:Input进程的创建,监听线程的启动,本文主要从系统源码的角度带你一步步了解Android Input子系统. 从我个人的理解来看,Android的Input系统其实就是系统级的事件处理.分发框架,它需要的功能模块大致有:事件读取.事件分类.事件分发.那么我们就从整个Input系统的输入源入手,了解事件是如何被输入到Input系统中的. 在看代码前我们先想一想,如果要我们设计一个事件分发框架的输入读取模块,要考虑到哪些子模块: 事件生成模块(当用户对设

请问一个线程在启动HttpWebRequest使用时,(发生阻塞或超时的解决办法) ??

问题描述 请问一个线程在启动HttpWebRequest使用时,(发生阻塞的解决办法)HttpWebRequest访问某地址时,如果该线程发生阻塞或超时,是否会影响网络资源,以及如何结束该线程??请高手提示一二. 解决方案 解决方案二:帮你顶一下解决方案三:加个try语句就可以了.解决方案四:up解决方案五:友情帮顶~解决方案六:Timeout设长一点,同时使用异步来BeginGetResponse来处理.解决方案七:try....catch啊解决方案八:这个如果失败,应该是可以抛出一个异常的,

ASP.net应用程序布置到服务器后,子线程无法启动的问题

问题描述 我的网站里面,应用程序的Global文件里面加了一个timer,在定时器事件里我写了启动三个子线程的操作.在开发机上,所有一切都运行正常,三个子线程的处理也都能正常进行.但是,当我把网站布置到VPS服务器后,三个子线程的处理却都没有进行.而且,log文件显示,timer事件是正常运行了的,也就是说它进行了启动子线程的处理,但是,就是没有任何结果,好像子线程没有启动起来.是不是需要有什么特殊的权限配置或者其他什么设置呢? 解决方案 解决方案二:把日志写在子线程的入口看看?解决方案三:每一

java-JAVA启动线程的问题不清楚

问题描述 JAVA启动线程的问题不清楚 启动线程: new Thread(x).start()和x.start()有什么区别,什么时候该用那个? 解决方案 前者定义了一个无名线程直接启动了,而后者定义了一个线程变量名为t,二者功效一样,但是后者可以对这个线程对象进行其他操作,例如中断x. interrupt();区别就是是否需要对线程对象进行其他操作,如果需要的话就要用变量接收. 解决方案二: 对于线程的启动来说,是一样的. 但后继是否还有操作线程,两者是不一样的:前者无法再操作此线程,而后者可

关于web开发中使用tomcat,启动一个线程

问题描述 主要是在一个web程序中,需要启动一个线程,在线程中启动socket通信,接受一些命令和数据.我已经用servlet实现了,自己写个servlet,然后在web.xml中配置,<servlet> <servlet-name>MInaServerStartUpServlet</servlet-name> <servlet-class>com.traffic.servlet.MinaServletListener</servlet-class&g

java多线程总结一:线程的两种创建方式及优劣比较

http://blog.csdn.net/touch_2011/article/details/6891026 1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现类的对象. (3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象.(接口可以实现多继承) (4).调用Thread对象的start()方法,启动线程 示例代码

Java线程池架构原理和源码解析(ThreadPoolExecutor)

在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:<java之JUC系列-外部Tools>中第一部分有详细的说明,请参阅: 文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,但是理解了ThreadPoolExecutor,在看ScheduledThreadPoolExe