线程的取消
以前的什么stop() suspend()方法都已经别取消了,那如何安全的终止线程呢?
我们在多线程编程中,总是会终止线程,那该如何操作呢?
今天看《Java并发编程艺术》这本书,在书中学到一种终止线程的方法。
通过设置标志位,通过检测标志位来觉得是否要终止线程
- 标志位用 volatile 来修饰,满足可见性。
代码如下:
public class Runner implements Runnable {
private long i;
private volatile boolean on =true;
@Override
public void run() {
while(on && !Thread.currentThread().isInterrupted()){
i++;
}
System.out.println("Count i:"+ i);
}
public void cancel(){
on= false;
}
}
执行类:
public class ShutDown {
public static void main(String[] args) throws InterruptedException {
Runner run = new Runner();
Thread countThread = new Thread(run,"CountThread");
countThread.start();
TimeUnit.SECONDS.sleep(1);
countThread.interrupt();
Runner runner01= new Runner();
countThread= new Thread(runner01,"CountThead");
countThread.start();
TimeUnit.SECONDS.sleep(1);
runner01.cancel();
}
}
- 通过cancle()方法来终止线程,然而cancle()方法只是将标志位设置为falese。
关于线程终止,唤醒理解
不管是要终止的线程还是唤醒的线程,都要先获得该对象的锁。
每个对象都有自己的锁,线程要对对象进行操作,会通过对象的监听器来尝试获取该对象锁,如果获取成功才能在该对象上进行相应的操作。
-
以前一直没明白对象锁的作用,通过上面的图,有了大概的了解。
-
调用notify()/notifyAll()将线程从等待状态编程阻塞状态。
等待/通知机制
流程如下:
- 加锁
- 条件循环
- 处理逻辑
1、 等待方遵守的条件
2、通知方遵守的条件