首页 > 编程语言 >Java实现延迟执行代码

Java实现延迟执行代码

时间:2023-04-18 10:25:36浏览次数:46  
标签:Java Thread 代码 sleep someTask 线程 延迟

Java实现延迟执行代码
对于Java程序在它们的操作中添加延迟或暂停是比较常见的。这对于任务暂停直到另外任务完成执行场景比较有用。本文我们提供两类方法实现延迟执行。

1. 基于线程(Thread)方法
当Java查询运行时,它在操作系统上产生一个进程,其至少包含一个线程————主线程负责查询运行。而且,Java支持多线程,程序可以创建新的线程与主线程并行或异步执行。

1.1. 使用Thread.sleep
Java中一种快速却不可靠的暂停方式是让当前线程休眠一定时间。使用Thread.sleep(milliseconds)来完成:

try {
    Thread.sleep(secondsToSleep * 1000);
} catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
}

使用try…catch捕获sleep方法的异常是很好的实践方式。上面示例捕获InterruptedException并显示中断当前线程,为了后续处理。这在多线程程序非常重要。

1.2. 使用TimeUnit.sleep

使用TimeUnit.XXX.sleep(y),可读性更好,其中xxx是休眠的时间单位,如SECONDS, MINUTES等,y是数量。其背后还是使用Thread.sleep,请看示例:

try {
    TimeUnit.SECONDS.sleep(secondsToSleep);
} catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
}

使用基于线程方式有几个缺点:

休眠时间不精确,特别是当时间增量较小时,如毫秒、纳秒。
当在循环内部使用,休眠在循环迭代之间会稍微漂移,因为其他代码执行导致多次迭代后执行时间不够精确。
2. 基于ExecutorService方法
Java提供了ScheduledExecutorService接口是更强大、精确的解决方案。接口可以安排代码在指定的延迟或固定的时间间隔后运行一次。要在延迟之后运行一段代码,我们可以使用schedule方法:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

Classname::someTask 部分是指定特定方法延迟执行。

  • someTask是执行方法的名称
  • Classname是包括someTask方法的类名称

以固定时间间隔执行,可以使用scheduleAtFixedRate :

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
 
executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

这会重复调用someTask方法,每次调用后暂停delayInSeconds秒。除了允许更多的计时选项之外,ScheduledExecutorService方法还可以产生更精确的时间间隔,因为它可以防止漂移问题。

标签:Java,Thread,代码,sleep,someTask,线程,延迟
From: https://www.cnblogs.com/lemperor/p/17328610.html

相关文章

  • java参数值传递
    题目: (1)定义一个Circle类,包含一个double型的radius属性代表圆的半径 *一个findAre()方法返回圆的面积。 *  *(2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下: *  *publicvoidprintAreas(Circlec,inttime) *在printAreas方法中......
  • java 递归方法 计算1-100之间的所有自然数的和 计算1-100之间所
    packageprectice;/***递归方法的使用**递归方法的定义:一个方法体内调用他自身**①方法递归包含了一种隐式循环,它会重复执行某段代码,但这种重发执行无须循环控制。*②递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似死循环。** 例1:计......
  • java笔试题目——要求:仅打印出a=100,b=200,请写出method方法的代码
    //题目:publicclassTest{publicstaticvoidmain(String[]args){inta=10;intb=10;method(a,b);//需要在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码。System.out.println("a="+a);S......
  • Java 实现Arrays 数组工具类
    ClassArrays是java工具包自带的非常强大的数组工具类,今天手工实现了一部分功能,部分参考实现如下publicclassMyArrays{//最大值/***获取int数组最大值**@paramarr:代遍历的数组*@return数组最大值*/publicintgetMax(......
  • java集合的stream操作
     //获取user里面所有id集合List<String>idList=list.stream().map(User::getId).collect(Collectors.toList());//list转换为id为key的mapMap<String,User>userMap=list.stream().collect(Collectors.toMap(User::getId,a->a,(k1,k2)->k1));//li......
  • ziyi-lstm-train代码
    lstm的train代码deftrain_lstm(net,lr,train_loader,total_epoch):global_step=1optimizer=torch.optim.Adam(net.parameters(),lr=lr)scheduler=lr_scheduler.MultiStepLR(optimizer,milestones=[iforiinrange(0,500,150)][1:],gamma=0.05)......
  • valhalla瓦片标准和相关代码
    Hierarchies/LevelsTilesaresplitupintothreelevelsorhierarchies.Hierarchy0containsedgespertainingtoroadsthatareconsideredhighway(motorway,trunk,andprimary)roadsandarestoredin4degreetiles.Hierarchy1containsroadsthatarea......
  • 用postman模拟“授权代码授予”模式下获取Azure的用户信息(UserInfo)
    用postman模拟“授权代码授予”模式下获取Azure的用户信息(UserInfo)1.准备参数:图1:图2:2.调用:点击按钮“GetNewAccessToken”,如果成功那么会弹出如下对话框:3.读取AccessToken:点击按钮“Proceed”,如果成功那么会弹出如下对话框:4.调用UserInfo:点击按钮“UseToken......
  • java如何将JSONObject转成实体对象
    importcom.google.gson.Gson;importorg.json.JSONObject;//...JSONObjectjson=newJSONObject("{\"name\":\"JohnSmith\",\"age\":30}");Gsongson=newGson();Personperson=gson.fromJson(json.toString()......
  • Java-Day-10(Object 常用类 + JDK 源码 + 断点调试)
    Java-Day-10Object常用类equals方法==与equals==是一个比较运算符既可以判断基本类型,又可以判断引用类型如果判断基本类型,判断的是值是否相等如果判断引用类型,判断的就是地址是否相同,即判断是否是一个对象equals是Object类中的方法,只能判断引用类型默认......