您的位置:首页 > 数据库

通过改变数据库字段的状态,使用volatile关键字特性可以让一个线程去终止另一个正在运行的线程停止

2019-04-23 21:18 537 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_26556385/article/details/89481055

1、一个线程正在执行一个无线循环的任务,怎样让其停下来?

@RestController
public class VolatileController {
    private Thread1 t1;

    @Autowired
    private ProductService productService;

    @RequestMapping("/make")
    public String makeThreadByVolatile() throws InterruptedException {
        //启动一直会运行的线程
        t1 = new Thread1();
        Thread tt1 = new Thread(t1);
        tt1.start();
        return "1";
    }

   //定时去数据库取状态,为false则取执行Thread0,改变volatile修饰的flag的值为false,由于被volatile修饰的关键字线程之间内存可见,线程Thread1中的while循环就会被终止   

   @Scheduled(fixedRate = 3000)
    public void task(){
        System.out.println("3秒定时任务====================================================");
        Map<String,String> map = productService.selectFlagStatus();
            if("false".equals(map.get("1001"))){
                //去终止Thead1不断运行的线程
                Thread0 t0 = new Thread0(t1);
                Thread tt2 = new Thread(t0);
                tt2.start();
            }
    }
}
 
2、线程1

public class Thread1 implements Runnable {
    private volatile boolean flag = true;

    public void stop(){
        flag = false;
    }

    @Override
    public void run() {
        while(flag)
            System.out.println("我一直在奔跑。。。");
    }
}

3、线程0

public class Thread0 implements Runnable{
private Thread1 t;

public Thread0(Thread1 t) {
this.t = t;
}

@Override
public void run() {
/*try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
t.stop();//终止线程Thread1
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐