常见方法:
1.start 和 run:
start():启动一个新线程,在新的线程运行 run 方法中的代码
**注意:**start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException
run():新线程启动后会调用的方法
如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法,否则默认不执行任何操作。但可以创建 Thread 的子类对象,来覆盖默认行为
2.sleep和yield:
sleep
1.调用sleep会让当前线程从Running进入Timed Waiting状态**(阻塞)**
2.其他线程使用interrupt方法打断正在睡眠的线程,此时sleep方法会抛出InterrupedException
3.睡眠结束后的线程未必会立即执行
4.建议使用TimeUnit的sleep代替Thread的sleep来获得更好的可读性
yield
1.调用yield会让当前线程从Running进入Runnable**就绪**状态,然后调度执行其他线程
2.具体的实现依赖于操作系统的任务调度器(可能没有其他线程,调用yield后还是会分给当前线程)
区别:
操作系统的时间调度器可以将cpu分配给就绪状态的线程,但是不能分配给阻塞状态的线程
3.优先级:setPriority() 默认为5 范围是1-10
4.join:等待调用join的线程运行结束
join可以有参数,表示最多等待的时间(毫秒)
线程的同步(需要等待结果的返回)
5.interrupt:打断正在运行的线程
打断 sleep,wait,join 的线程会重置打断标记为false
isInterrupted():可以获取打断标记,正常运行的线程并不会直接被打断,可通过打断标记判断,若被打断则结束线程
interrupted():判断完是否被打断之后,会清楚打断标记(true->false)
多线程设计模式之两阶段终止:
T1线程‘’优雅的‘’终止线程T2 优雅:给T2一个做其他事情的机会(通过我们写的代码)
错误思路
使用线程对象的 stop() 方法停止线程
stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁
使用 System.exit(int) 方法停止线程
目的仅是停止一个线程,但这种做法会让整个程序都停止
两阶段终止模式:
6.不推荐使用的方法
这些方法已过时,容易破坏同步代码块,造成线程死锁
stop() 停止线程运行
suspend() 挂起(暂停)线程运行
resume() 恢复线程运行