- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程(已阅)
线程
线程的状态
线程的状态表示线程在某段时间内进行的活动和将要进行的任务。线程有创建、就绪、运行、阻塞、死亡5种状态。
创建状态
实例化Thread对象,但没有调用start()方法时的状态。例如:
ThreadTest tt=new ThreadTest();
或者
Thread t=new Thread(tt);
此时虽然创建了Thread对象,但是他们暂时不能通过isAlive()测试。
就绪状态
程序有资格运行,当调度程序还没有把它选为线程运行时所处的状态。此时,线程具备了运行的条件,一旦被选中马上就能运行。
线程创建后,调用了start()方法,线程不处于运行状态,但能通过isAlive()测试。在线程运行后,或者从被阻塞、等待或者睡眠状态回来之后,线程首先进入就绪状态。
运行状态
从就绪状态池(是池,不是队列)中被选择为当前执行的线程所处的状态。
等待、阻塞或者睡眠状态
线程依然是活的,但是缺少运行的条件,一旦具备了条件就可以转为就绪状态(不能直接转为运行状态)。另外,suspend()和stop()方法已经被废弃了,比较危险,不要再使用了。
死亡状态
一个线程的run()方法运行结束,那么该线程就完成了它的使命,它的栈结构将解散,也就是死亡了。但是该线程仍然是一个Thread对象,仍可以被引用这一点与其他对象一样,而且被引用的对象也不会被垃圾回收器回收。
一旦线程死去,他就永远不能重新启动了,也就是说,不能再用start()方法让它运行。
创建线程有两种方式。
⑴继承java.lang.Thread类
public class ThreadTest extends Thread {
public void run(){
System.out.println(something run here!);
}
public void run(String s){
System.out.println(string in run is+s);
}
public static void main(String[] args) {
ThreadTest tt=new ThreadTest();
tt.start();
tt.run(it wont auto run);
}
}
运行结果如下:
string in run isit wont auto run
something run here!
注意:是否与想象的顺序相反了?为什么呢?
一旦调用了start()方法,必须给JVM留足时间,让它配置进程。而在JVM配置完成之前,重载的run(String s)方法被调用了,结果反而先输出了“string in run is it won’t auto run”。之后,tt线程完成了配置,输出了“something run here!”
这个结论是比较容易验证。
修改上面的程序,在“tt.start();”语句后面加上语句“for(int i=0;i10000;i++);”.主线程必须执行运算量比较大的for循环,只有执行完for循环才能运行后面的“tt.run(“it won’t auto run!”);”语句。此时,因为有足够的时间完成线程的配置,所以修改后的程序运行结果如下:
something run here
stirng in run is it won’t auto run!
注意:这种输出结果的顺序是没有保障!不要依赖循环耗时!
Thread类有许多管理线程的方法,包括创建、启动和暂停他们,所有的操作都是从run()方法开始,并且在run()方法内编写需要在独立线程内执行的代码。run()方法可以调用其他方法,但是执行的线程总是通过调用run()开始。
没有参数的run()方法是自动被调用的,而带参数的run()是被重载的,必须显示调用。
上面示例中创建线程的方式很简单,但不是最好的方案。Java是单继承结构的,如果继承了Thread类,那么就不能继承其它的类了,应该把继承的机会留给别的类。
⑵实现java.lang.Runnable接口
public class ThreadTest implements Runnable {
public void run(){
System.out.println(something run here!);
}
public static void main(String[] args) {
ThreadTest tt=new ThreadTest();
Thread t1=new Thread(tt);
Thread t2=new Thread(tt);
t1.start(
文档评论(0)