Как генерировать случайные числа через заданные интервалы времени? - PullRequest
1 голос
/ 06 февраля 2010

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

Ответы [ 5 ]

7 голосов
/ 06 февраля 2010

Этот пример добавляет случайное число в очередь блокировки каждые две минуты. Вы можете взять номера из очереди, когда они вам нужны. Вы можете использовать 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();
1 голос
/ 06 февраля 2010
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 голос
/ 06 февраля 2010

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

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

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

1 голос
/ 06 февраля 2010

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

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

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

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

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

0 голосов
/ 06 февраля 2010

Я не совсем уверен, что понимаю проблему. Если вы хотите генерировать другое случайное число каждые две минуты, просто вызывайте функцию 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...