【C#】4种方法优雅的关闭线程Thread
其实现在已经很少会单独用Thread开启一个线程任务了,剩下还有一些情况,比如说单独开启一个线程读取数据库数据,然后把读到的数据提交到线程池中处理。
一般来说会这样处理:
new Thread(()->{
while(true){
//访问数据库,读取数据
//更新这部分数据的状态,保证下次不再读到
//间隔1s
}
}).start();那什么情况下需要关闭线程呢,当然是我不想再处理任务的时候了。Thread有提供stop方法,但是由于不安全,已经被弃用了。
这可不是开玩笑,Thread任务执行完毕,自己就关闭了,不需要特地去关。
当run方法中式while(true)循环的时候就需要通过boolean标志去控制了。
static volatile boolean runFlag;
new Thread(()->{
while(true){
//访问数据库,读取数据
//更新这部分数据的状态,保证下次不再读到
//间隔1s
if(runFlag){
break;
}
}
}).start();同样地,也可以用AtomicBoolean去控制。
static AtomicBoolean runFlag = new AtomicBoolean(false);
new Thread(()->{
while(true){
//访问数据库,读取数据
//更新这部分数据的状态,保证下次不再读到
//间隔1s
if(runFlag.get()){
break;
}
}
}).start();
runFlag.set(true)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种方法中断线程。