java - 使用调度的执行器生成一个新的随机数,然后将该数字作为 Java 中的新时间间隔传递
问题描述
早上好,
我想启动一个调度线程,该线程每次执行时都会生成一个新的随机数,然后使用该新数作为再次触发之前的间隔。我以前使用大致以下代码来执行一个定期运行的线程:
public void start() {
long delay = 5;
final Runnable g = () -> {
delay = (long)(50 * (Math.random()+0.1));
thingDoer.doAwesomeThings();
};
final ScheduledFuture<?> passerbyGenerator = schedule.scheduleAtFixedRate(g, 1, delay,
TimeUnit.MILLISECONDS);
}
我从来没有尝试在没有固定间隔的情况下这样做。我知道我上面的内容行不通。首先,最后一行代码设置了调度,并且只执行一次。其次,看起来我不能在预定线程内使用变化的变量。我收到以下错误:“在封闭范围中定义的局部变量延迟必须是最终的或有效的最终。”
我怎样才能启动一个线程来做我想做的事情?换句话说,我怎样才能安排一个不定期发出哔哔声的蜂鸣器?
解决方案
public class ThingDoer implements Runnable {
private long delay;
public ThingDoer(int initialDelay) {
this.delay = initialDelay;
}
public static void main(String[] args) {
new Thread(new ThingDoer(5)).start();
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(delay);
delay = (long) ((Math.random() + 0.1) * 50);
doAwesomeThings();
System.out.println(String.format("next delay: %s", delay));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void doAwesomeThings() {
System.out.println("did something awesome");
}
}
实际输出:
did something awesome
next delay: 31
did something awesome
next delay: 12
did something awesome
next delay: 48
did something awesome
next delay: 31
did something awesome
next delay: 44
did something awesome
next delay: 20
did something awesome
next delay: 26
did something awesome
next delay: 18
did something awesome
next delay: 39
did something awesome
next delay: 32
推荐阅读
- docker - Terraform Docker Provider:有什么方法可以在 Docker 主机上执行命令?
- sql - SQL查询优化实践
- python - 我的 Django Python 代码没有更改数据库记录
- html - 旋转div时如何将文本与左侧对齐?
- android - android设备启动后如何执行一些应用程序(没有UI的简单C应用程序)
- swift - Firebase 身份验证 - 使用电话身份验证忘记密码
- firebase - TypeError:navigation.getParam 不是函数 - 反应原生
- azure - Azure 中的 Terraform/HCL 问题
- mysql - 如何在 mysql 中使用 json_object 创建值是动态的对象?
- c# - 带有 NetTopologySuite.IO.GeoJSON 的 JsonConvert.DeserializeObject 有异常 未找到预期令牌“}”