Подтвердить что ты не робот

Java Loop каждую минуту

Я хочу написать цикл на Java, который начинается и идет следующим образом:

while (!x){
    //wait one minute or two

    //execute code
}

Я хочу сделать это, чтобы он не использовал системные ресурсы. То, что на самом деле происходит в коде, это то, что оно отправляется на веб-сайт и проверяет, не сделано ли что-то, если это не сделано, он должен подождать еще одну минуту, пока он не проверит снова, и когда он будет выполнен, он просто начнет движение. Их все равно сделать это в java?

4b9b3361

Ответ 1

Используйте Thread.sleep(long millis).

Заставляет текущий исполняемый поток спать (временно прекратить выполнение) за указанное количество миллисекунд, с учетом точности и точности системных таймеров и планировщиков. Нить не теряет права собственности на какие-либо мониторы.

Одна минута будет (60*1000) = 60000 миллисекунды.


Например, этот цикл будет печатать текущее время один раз каждые 5 секунд:

    try {
        while (true) {
            System.out.println(new Date());
            Thread.sleep(5 * 1000);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

Если ваш период ожидания становится слишком большим для int, явным образом вычисляю в long (например, 1000L).

Ответ 2

Вы можете использовать Timer

Timer timer = new Timer();

timer.schedule( new TimerTask() {
    public void run() {
       // do your work 
    }
 }, 0, 60*1000);

Когда придет время

  timer.cancel();

Чтобы отключить его.

Ответ 3

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(yourRunnable, 1L, TimeUnit.MINUTES);
...
// when done...
executor.shutdown();

Ответ 4

ScheduledExecutorService

Ответ Ли близок, но работает только один раз. Вопрос, кажется, требует бесконечного прогона, пока не изменится внешнее состояние (до тех пор, пока не изменится ответ с веб-сайта/службы).

Интерфейс ScheduledExecutorService является частью пакета java.util.concurrent, встроенного в Java 5 и позже, как более современную замену для старого Timer.

Вот полный пример. Вызовите scheduleAtFixedRate или scheduleWithFixedDelay.

ScheduledExecutorService executor = Executors.newScheduledThreadPool ( 1 );

Runnable r = new Runnable () {
    @Override
    public void run () {
        try {  // Always wrap your Runnable with a try-catch as any uncaught Exception causes the ScheduledExecutorService to silently terminate.
            System.out.println ( "Now: " + Instant.now () );  // Our task at hand in this example: Capturing the current moment in UTC.
            if ( Boolean.FALSE ) {  // Add your Boolean test here to see if the external task is fonud to be completed, as described in this Question.
                executor.shutdown ();  // 'shutdown' politely asks ScheduledExecutorService to terminate after previously submitted tasks are executed.
            }

        } catch ( Exception e ) {
            System.out.println ( "Oops, uncaught Exception surfaced at Runnable in ScheduledExecutorService." );
        }
    }
};

try {
    executor.scheduleAtFixedRate ( r , 0L , 5L , TimeUnit.SECONDS ); // ( runnable , initialDelay , period , TimeUnit )
    Thread.sleep ( TimeUnit.MINUTES.toMillis ( 1L ) ); // Let things run a minute to witness the background thread working.
} catch ( InterruptedException ex ) {
    Logger.getLogger ( App.class.getName () ).log ( Level.SEVERE , null , ex );
} finally {
    System.out.println ( "ScheduledExecutorService expiring. Politely asking ScheduledExecutorService to terminate after previously submitted tasks are executed." );
    executor.shutdown ();
}

Ожидайте вывод следующим образом:

Now: 2016-12-27T02:52:14.951Z
Now: 2016-12-27T02:52:19.955Z
Now: 2016-12-27T02:52:24.951Z
Now: 2016-12-27T02:52:29.951Z
Now: 2016-12-27T02:52:34.953Z
Now: 2016-12-27T02:52:39.952Z
Now: 2016-12-27T02:52:44.951Z
Now: 2016-12-27T02:52:49.953Z
Now: 2016-12-27T02:52:54.953Z
Now: 2016-12-27T02:52:59.951Z
Now: 2016-12-27T02:53:04.952Z
Now: 2016-12-27T02:53:09.951Z
ScheduledExecutorService expiring. Politely asking ScheduledExecutorService to terminate after previously submitted tasks are executed.
Now: 2016-12-27T02:53:14.951Z