我们常用的延迟操作,在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个执行成功
感谢您的支持,写的文章如对您有所帮助,开源不易,请您打赏,谢谢啦~