JAVA 线程延迟的几种操作

我们常用的延迟操作,在JS或者python 3中有异步操作,处理这种问题是比较简单,在java中也有几种处理延迟的方式,这里我们来看一下四种操作

第一种,主线程直接延迟 1秒

//do something 1
System.out.println("主线程 -> 1");
try {
     Thread.sleep(1000);
}catch (Exception e){}
System.out.println("主线程 -> 2");
//do something 2

这种方式不适用与并发高的操作,当多个并发同时访问,会出现线程死锁的情况,导致cpu飙升!

第二种,开辟子线程执行延迟 1秒

//do something 1
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("子线程 -> 1");
        try {
        Thread.sleep(1000);
        }catch (Exception e){}
        System.out.println("子线程 -> 2");
       //do something 2
    }
}).start();

这种方式,适用于高并发操作,但是子线程的执行顺序不可控制,有时候线程1执行了,有时候线程2执行了。而且子线程中使用sleep,会出现较多的线程,需要线程池来控制

第三种,使用定时器无限执行延迟 1秒

private boolean cmdLock = true;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
            System.out.println("子线程延迟1秒-> 且无限循环");
           
            if(cmdLock){
                 cmdLock = false; //关闭锁
                 //dosomething
                 
                 cmdLock = true; //开启锁
            }
    }
}, 1000,0);

这种方式,把正常的我们需要在1次性 执行的多个操作,转换思路为:给分割到1秒钟需要执行那些操作。支持高并发,但是随着dosomething 的内容越来越多,延迟时间会越来越大,不适用对延迟时间点要求较高的情况

第四种,使用定时器执行操作延迟 1秒

//do something 1
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println("子线程延迟1秒-> 1");
        //do something 2
        timer.cancel(); //执行完毕停止定时器
    }
}, 1000);

 这种方式,把1个操作分为2个部分,第一部分执行后,延迟1秒,执行第二部分,适用于高并发请求,但是缺点是do something2的执行结果,无法直接获取,需要对结果进行存储,待监测到do something 2的结果后,才能知道是否2个执行成功

感谢您的支持,写的文章如对您有所帮助,开源不易,请您打赏,谢谢啦~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值