jdk stop与interrupt的区别

让线程终止的方法

调用Thread实例方法 stop()

特点

线程会立即终止,可能会丢失任务,不可控. 官方已废弃该方法

调用 Thread实例方法 interrupt()

特点

不会主动终止线程, 只是发出中断信号, 由程序员自己控制是否要终止线程

api 方法

public void interrupt()//发出中断指令
public boolean isInterrupted()//判断是否有中断标志
public static boolean interrupted()//判断是否被中断,并且清除当前中断状态

实验代码

package com.nanxhs.concurrent.thread;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * 序号生成任务器
 *
 * @author: haibin.tang
 * @date: 2021/1/27
 */
public class GenericSequenceRunner implements Runnable {

    private Set<Integer> codeList = new HashSet<>();

    @Override
    public void run() {
        while (true) {
            // 判断是否有中断标志
            if (codeList.size() > 10 && Thread.currentThread().isInterrupted()) {
                System.out.println(Thread.currentThread().getName() + "收到线程中断信号并且生成的code数量大于10,结束生成code任务");
                break;
            }
            int code = (int)(Math.random() * 10000);
            codeList.add(code);
            System.out.println(Thread.currentThread().getName() + " 生成code -->> " + code);
            LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
        }
    }
}
package com.nanxhs.concurrent.thread;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * 线程结束测试类
 *
 * @author: haibin.tang
 * @date: 2021/1/27
 */
public class ThreadOverMain {

    public static void main(String[] args) {
        Thread stopRunner = new Thread(new GenericSequenceRunner());
        Thread interruptedRunner = new Thread(new GenericSequenceRunner());
        stopRunner.start();
        interruptedRunner.start();
        LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5));
        //线程立即就终止了
        stopRunner.stop();
        //线程不会立即终止,是否终止由代码逻辑自己控制
        interruptedRunner.interrupt();
    }
}

实验结果

Thread-0 生成code -->> 5327
Thread-1 生成code -->> 9789
Thread-0 生成code -->> 2338
Thread-1 生成code -->> 8077
Thread-0 生成code -->> 4298
Thread-1 生成code -->> 3600
Thread-1 生成code -->> 6519
Thread-1 生成code -->> 1858
Thread-1 生成code -->> 5675
Thread-1 生成code -->> 6719
Thread-1 生成code -->> 735
Thread-1 生成code -->> 893
Thread-1 生成code -->> 765
Thread-1 生成code -->> 1083
Thread-1收到线程中断信号并且生成的code数量大于10,结束生成code任务
posted @   四码难追  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示