文章目录
线程的基本操作
所有方法图示
wait和notify
概念
- wait()让进入object监视器的线程等待
- notify()在object上正在等待的线程中挑一个唤醒
- wait(long timeout)让进入object监视器的线程等待,如果过了timeout秒没被唤醒,就自动唤醒并进行下面的流程
- notifyAll()让object上正在等待的线程全部唤醒
注意
它们都是线程之间进行协作的手段,都属于Object对象的方法。必须获得此对象的锁,才能调用这几个方法
obj.wait(long timeout)例子:
sleep/wait
- sleep是 Thread方法,而wait是Object的方法
- sleep不需要强制使用,但wait需要和synchronized配合使用
- sleep在睡眠的同时,不会释放对象锁,但wait在等待的时候会释放对象锁
- wait是不需要捕获异常,sleep必须要捕获异常
过时方法
stop() 停止线程运行 interrupt代替
suspend() 暂停线程 wait代替
resume() 唤醒线程 notify代替
守护线程
默认情况下,Java进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。
while死循环,运行没有结束
加了t1的守护线程,当main结束时,t1跟着结束
创建线程的四种方式
继承Thread
重写Runnable
推荐使用Runnable:
- 用 Runnable更容易与线程池等高级AP配合
- 用 Runnable让任务类脱离了 Thread继承体系,更灵活
FutureTask配合Thread
实现callable接口
线程池(开发运用)
重复利用,提高效率
1、提供线程池
ThreadPoolExecutor servic = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
2、属性设置
3、运用