java子线程关闭_Java控制子线程的退出

存在监控线程,日志线程等需要同主线程一同存在与退出,那么如何在主线程退出前正确优雅的结束这些子线程?

因为stop方法(以及用于暂停的suspend)都不能释放资源而导致死锁等问题已经弃用,这里只讨论优雅的退出方式。

共享变量控制法

import java.util.concurrent.TimeUnit;

public class TerminationThread {

private volatile boolean run;

public void start(){

run = true;

new Thread(() -> {

while (run) {

try {

System.out.println("处理事务");

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("结束前后续处理步骤");

}).start();

}

public void stop(){

run = false;

}

public static void main(String[] args) throws InterruptedException {

TerminationThread terminationThread = new TerminationThread();

terminationThread.start();

TimeUnit.SECONDS.sleep(5);

terminationThread.stop();

}

}

打断(interrupt)的方法

import java.util.concurrent.TimeUnit;

public class TerminationThread3 {

private Thread t;

public void start() {

t = new Thread(() -> {

while (true) {

if (t.isInterrupted()) {

System.out.println("结束前后续处理步骤");

break;

}

try {

System.out.println("处理事务");

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

t.interrupt();//睡眠中被打断会清楚打断标记,这里补上标记让下个循环开始退出

}

}

}, "t");

t.start();

}

public void stop() {

t.interrupt();

}

public static void main(String[] args) throws InterruptedException {

TerminationThread3 terminationThread3 = new TerminationThread3();

terminationThread3.start();

TimeUnit.SECONDS.sleep(5);

terminationThread3.stop();

}

}

守护线程(没有办法释放资源,但可以让子线程随主线程一同结束,可以容忍后续步骤不完成的情况下使用)

import java.util.concurrent.TimeUnit;

public class TerminationThread2 {

public static void main(String[] args) throws InterruptedException {

Thread t = new Thread(() -> {

while (true) {

try {

System.out.println("处理事务");

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t.setDaemon(true);

t.start();

TimeUnit.SECONDS.sleep(5);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值