1、终止线程
-Thread.stop()不推荐使用。它会释放所有monitor.
例子:
1.线程1,准备写ID=1,NAME=啊花
2.线程2,等待资源,准备写ID=2,NAME=隔壁老王
当线程1再写数据ID=1,进去后,准备写NAME=啊花,当系统暴力调用stop方法,此时线程1会释放资源。而,线程2抢占到资源后,会读到不一致错误的数据。
2、线程中断
-Thread.interrupt() 中断线程
-Thread.currentThread().isInterrupter()判断线程是否处于中断状态
伪代码:
Thread t = new Thread(new Runnable(){
public void run() {
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("thread is interrupted...");
break;
}
}
Thread.yield();//真正让现场进入等待地操作
}
});
升级稳妥地中断操作:
Thread t = new Thread(new Runnable(){
public void run() {
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("thread is interrupted...");
break;
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
//设置线程中断异常,重新设置中断操作
Thread.currentThread().interrupt();
}
}
Thread.yield();//真正让现场进入等待地操作
}
});
3、挂起(suspend)和继续执行(resume)线程
- suspend()不会释放锁
- 如果加锁发生在resume()之前,死锁就会产生
例如,线程1正在执行,线程2通过resume线程1,此时线程1在调用suspend方法。那么,如果线程2resume调用线程1发生在suspend之前,就会发生线程1占用资源,产生死锁状态。
上代码:
查找进程状态:
说明t2状态处于RUNNABLE状态
4、等待线程结束(join)和谦让(yeild)
join通常使用在等待某个线程执行完之后,我再执行下一步操作。
join(0) 0表示无限期地等待。
实现原理
5、守护线程
守护线程设置要在线程开启之前,上图案例,不会执行syso方法,不会打印出 I am alive