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

线程的取消

以前的什么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、通知方遵守的条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值