使用计划的执行器生成一个新的随机数,然后在 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

最新更新