Как генерировать случайные числа через заданные промежутки времени?

Я разработал код на Java для генерации десяти случайных чисел в диапазоне от 0 до 99. Проблема в том, что мне нужно генерировать случайное число каждые 2 минуты. Я новичок в этой области и мне нужны ваши взгляды.

5 ответов

В этом примере случайное число добавляется в очередь блокировки каждые две минуты. Вы можете взять номера из очереди, когда они вам нужны. Вы можете использовать java.util.Timer в качестве упрощенного средства для планирования генерации чисел или использовать java.util.concurrent.ScheduledExecutorService для более универсального решения, если в будущем вам потребуется больше изощренности. Записывая номера в очередь, вы получаете единый интерфейс для получения номеров из обоих средств.

Сначала мы устанавливаем очередь блокировки:

final BlockingDequeue<Integer> queue = new LinkedBlockingDequeue<Integer>();

Вот установка с java.utilTimer:

TimerTask task = new TimerTask() {
    public void run() {
        queue.put(Math.round(Math.random() * 99));
        // or use whatever method you chose to generate the number...
    }
};
Timer timer = new Timer(true)Timer();
timer.schedule(task, 0, 120000); 

Это настройка с помощью java.util.concurrent.ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = new Runnable() {
    public void run() {
        queue.put(Math.round(Math.random() * 99));
        // or use whatever method you chose to generate the number...
    }
};
scheduler.scheduleAtFixedRate(task, 0, 120, SECONDS);

Теперь вы можете получать новое случайное число из очереди каждые две минуты. Очередь будет блокироваться, пока не станет доступен новый номер...

int numbers = 100;
for (int i = 0; i < numbers; i++) {
    Inetger rand = queue.remove();
    System.out.println("new random number: " + rand);
}

Как только вы закончите, вы можете прекратить работу планировщика. Если вы использовали таймер, просто сделайте

timer.cancel();

Если вы использовали ScheduledExecutorService, вы можете сделать

scheduler.shutdown();
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.Timer;

public class TimerExample {
    Random rand = new Random();
    static int currRand;

    TimerExample() {
        currRand = rand.nextInt(99);
        ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                currRand = rand.nextInt(99);
            }
        };
        Timer timer = new Timer(2000, actionListener);
        timer.start();
    }

    public static void main(String args[]) throws InterruptedException {
        TimerExample te = new TimerExample();
        while( true ) {
            Thread.currentThread().sleep(500);
            System.out.println("current value:" + currRand );
        }
    }
}

РЕДАКТИРОВАТЬ: Конечно, вы должны установить 2000 в новый таймер (2000, actionListener); до 120 000 за две минуты.

У вас есть два требования, которые не связаны:

  1. Генерировать случайные числа
  2. Выполняйте задание каждые 2 минуты.

Чтобы делать что-либо каждые 2 минуты, вы можете использовать ScheduledExecutorService.

Вы можете запланировать запуск вашей программы раз в две минуты, используя любые функции планирования, доступные вам в вашей целевой среде (например, cron, at, Запланированные задачи Windows и т. Д.).

Или вы можете использовать Thread#sleep способ приостановить ваше приложение на 2000 мс и запустить ваш код в цикле:

while (loopCondition) {
    /* ...generate random number... */

    // Suspend execution for 2 minutes
    Thread.currentThread().sleep(1000 * 60 * 2);
}

(Это просто пример кода, вам нужно обработать InterruptedException и тому подобное.)

Я не совсем уверен, что понимаю проблему. Если вы хотите генерировать другое случайное число каждые две минуты, просто позвоните rnd функционировать каждые две минуты.

Это может быть так просто, как что-то вроде (псевдокод):

n = rnd()
repeat until finished:
    use n for something
    sleep for two minutes
    n = rnd()

Если вы хотите использовать одно и то же случайное число в течение двух минут и сгенерировать новое:

time t = 0
int n = 0

def sort_of_rnd():
    if now() - t > two minutes:
        n = rnd()
        t = now()
    return n

который будет продолжать возвращать тот же номер в течение двух минут.

Другие вопросы по тегам