1 线程创建的方法有几种?
两种。
第一种 实现runnable接口 重写run()方法
第二种 继承thread类 重写run()方法
总结:两种,但都是基于thread类。第一种更优,java是类单继承。第一种让代码拓展性更强。
2 start() 方法含义与相关问题
正确启动线程:start()而不是run()。因为run()只是一个普通方法。start()启动线程后自动调用run()。
start()的工作原理:检查当前线程状态码是否为0(线程准备),如果重复调用start会报错。
然后调用start0()方法(一个native方法。)
3 如何正确停止线程
interrupt:给线程发出中断信号,线程接受信号后,由线程决定是否中断。保证数据的完整性。通知中断而不是强制中断。中断信号的获取需要线程中设置检测中断信号的代码。如果代码中有每次循环后sleep,则不需写代码检测中断信号,自动检测。写了就报错。
stop():强制中断线程,释放所有监视器。不是正确的停止方法,存在安全问题。脏数据。
suspend()和resume():已淘汰。suspend挂起,如果带锁挂起会导致死锁。
4 while里的try/catch问题
run()方法内无法抛出异常,因为是重写方法,原方法没有抛。
如果while里有try/catch 中断信号来了会中断失效,将信号吞掉。
正确处理方法:在方法签名中抛出异常或者在catch中重新抛出。不可以屏蔽中断
5 线程的生命周期(六种状态)
New :新建状态,可以start()
Runnable : 可运行状态 start之后,等待启动,可能还未启动。
Blocked:阻塞状态 进入synchronized修饰的代码,等待拿到锁的状态。
Wating:等待
Timed - wating:定时等待
Terminated:结束 正常结束或者出现未处理异常。
new runnable terminated 单向 不可逆
其他三个状态和runnable转换可逆,但不能跳跃转换。