使用计划的执行程序生成一个新的随机数,然后将该数字作为 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