1. 线程的状态
1 | // Thread中定义的State |
2. 线程的操作
2.1 新建线程
1 | // 新建线程 |
t1.run()只是调用了run方法,并不是新建线程.
2.2 终止线程
1 | // 不推荐的做法 |
使用stop容易造成数据不一致.
2.3 线程中断
线程中断不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出了.至于目标线程接到通知后如何处理,则完全由目标线程自行决定.
1 | public class Test { |
2.4 线程等待和线程通知
1 | public class Test { |
wait方法不是可以随便调用,必须在对应的同步代码块里,wait或者notify都需要先获得目标对象的监视器.线程执行wait方法前必须先获得对应Object的监视器,wait方法执行后会释放监视器,这时其他线程就可以获取这个Object的监视器了.这就实现了线程间通信.
wait和sleep都是让线程等待.wait会释放目标对象锁,sleep不会释放任何资源.2.5 挂起线程和继续执行线程
suspend和resume是一对相关的操作,也已经废弃了,不推荐使用.
suspend挂起线程后不会释放任何资源,其他等待被占用资源的线程都无法执行,使用不当会导致所有相关线程都无法运行.
suspend挂起线程后,线程还是Runnable状态,影响问题分析.
相关需求可以用wait和notify来实现, 下面是例子.
1 | public class Test { |
2.6 等待线程结束和谦让
等待线程结束(join), 谦让(yield)
join方法会阻塞当前线程,直到目标线程执行结束.本质就是让当前线程wait()在目标线程对象上,目标线程执行完成后会调用notifyAll通知所有等待线程继续执行.
1 | public class Test { |
Thread.yield()方法会让当前线程让出CPU,不过让出后还会进行CPU资源的争夺,能否再次分配到就看系统了.
3. 线程组
用来管理线程. 建议在创建线程和线程组的时候,取一个好听的名字.
下个给个例子,了解一下有这么回事.
1 | public class Test { |
4. 守护线程
守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默完成一些系统性的服务.当一个Java应用内只有守护线程时,Java虚拟机就会自然退出.
1 | public class Test { |
5. 线程优先级
直接看例子. 注意: 高优先级也可能抢占失败,这只是一个概率问题.
1 | public class Test { |
6. 参考链接
<< Java高并发程序设计 >>(葛一鸣 郭超)