管理杂谈OA答疑ERP答疑教程搜索

【C#】4种方法优雅的关闭线程Thread


其实现在已经很少会单独用Thread开启一个线程任务了,剩下还有一些情况,比如说单独开启一个线程读取数据库数据,然后把读到的数据提交到线程池中处理。

一般来说会这样处理:

new Thread(()->{
while(true){
//访问数据库,读取数据
//更新这部分数据的状态,保证下次不再读到
//间隔1s
}
}).start();

那什么情况下需要关闭线程呢,当然是我不想再处理任务的时候了。Thread有提供stop方法,但是由于不安全,已经被弃用了。

方式一:让任务执行完毕

这可不是开玩笑,Thread任务执行完毕,自己就关闭了,不需要特地去关。

方式二:volatile控制boolean关闭

当run方法中式while(true)循环的时候就需要通过boolean标志去控制了。

static volatile boolean runFlag;
new Thread(()->{
while(true){
//访问数据库,读取数据
//更新这部分数据的状态,保证下次不再读到
//间隔1s
if(runFlag){
break;
}
}
}).start();

方式三:AtomicBoolean控制关闭

同样地,也可以用AtomicBoolean去控制。

static AtomicBoolean runFlag = new AtomicBoolean(false);
new Thread(()->{
while(true){
//访问数据库,读取数据
//更新这部分数据的状态,保证下次不再读到
//间隔1s
if(runFlag.get()){
break;
}
}
}).start();
runFlag.set(true)

方式四:通过interrupt()方法

Thread自带interrupt()方法,可以发送一个中断请求,通过isInterrupted()来判断是否中断。

Thread t1 = new Thread(() -> {
    while (true) {
        System.out.println("111111111111111111111");
        if (Thread.currentThread().isInterrupted()) {
            break;
        }
    }
});
t1.start();
TimeUnit.SECONDS.sleep(3);
new Thread(()->{
    t1.interrupt();
}).start();

由此有了4种方法中断线程。


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn