使用计划的执行程序生成一个新的随机数,然后将该数字作为 Java 中的新时间间隔传递
Generate a new random number using scheduled executor and then passing that number as a new time interval in 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);
}
我从来没有尝试过在没有固定间隔的情况下这样做。我知道我上面的内容是行不通的。
首先,最后一行代码设置了时间表,并且只执行一次。其次,看起来我不能在预定线程内使用变化的变量。我收到以下错误:"local variable delay defined in an enclosing scope must be final or effectively final."
如何启动线程来执行我想执行的操作?换句话说,我如何安排一个不定期发出蜂鸣声的蜂鸣器?
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
早上好,
我想启动一个计划线程,每次执行时都会生成一个新的随机数,然后使用该新数作为再次触发之前的间隔。我以前曾使用大致如下代码定期执行线程运行:
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);
}
我从来没有尝试过在没有固定间隔的情况下这样做。我知道我上面的内容是行不通的。 首先,最后一行代码设置了时间表,并且只执行一次。其次,看起来我不能在预定线程内使用变化的变量。我收到以下错误:"local variable delay defined in an enclosing scope must be final or effectively final."
如何启动线程来执行我想执行的操作?换句话说,我如何安排一个不定期发出蜂鸣声的蜂鸣器?
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