多线程编程-如何安全的取消线程

线程的取消

以前的什么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。

关于线程终止,唤醒理解

不管是要终止的线程还是唤醒的线程,都要先获得该对象的锁。
每个对象都有自己的锁,线程要对对象进行操作,会通过对象的监听器来尝试获取该对象锁,如果获取成功才能在该对象上进行相应的操作。

多线程编程-如何安全的取消线程_第1张图片

  • 以前一直没明白对象锁的作用,通过上面的图,有了大概的了解。

  • 调用notify()/notifyAll()将线程从等待状态编程阻塞状态。

等待/通知机制

流程如下:

  • 加锁
  • 条件循环
  • 处理逻辑

1、 等待方遵守的条件

2、通知方遵守的条件

你可能感兴趣的:(#,《Java并发编程艺术》)