Как генерировать случайные числа через заданные промежутки времени?
Я разработал код на 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 за две минуты.
У вас есть два требования, которые не связаны:
- Генерировать случайные числа
- Выполняйте задание каждые 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
который будет продолжать возвращать тот же номер в течение двух минут.