首页 > 解决方案 > 使用调度的执行器生成一个新的随机数,然后将该数字作为 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);
}

我从来没有尝试在没有固定间隔的情况下这样做。我知道我上面的内容行不通。首先,最后一行代码设置了调度,并且只执行一次。其次,看起来我不能在预定线程内使用变化的变量。我收到以下错误:“在封闭范围中定义的局部变量延迟必须是最终的或有效的最终。”

我怎样才能启动一个线程来做我想做的事情?换句话说,我怎样才能安排一个不定期发出哔哔声的蜂鸣器?

标签: javascheduled-tasks

解决方案


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

推荐阅读