Друкуйте "привіт світ" кожні X секунд


127

Останнім часом я використовую петлі з великою кількістю для друку Hello World:

int counter = 0;

while(true) {
    //loop for ~5 seconds
    for(int i = 0; i < 2147483647 ; i++) {
        //another loop because it's 2012 and PCs have gotten considerably faster :)
        for(int j = 0; j < 2147483647 ; j++){ ... }
    }
    System.out.println(counter + ". Hello World!");
    counter++;
}

Я розумію, що це дуже дурний спосіб зробити це, але я ще ніколи не використовував жодної бібліотеки таймерів на Java. Як можна змінити вищезазначене, щоб надрукувати кожне сказане 3 секунди?


1
Хоча наведені нижче відповіді, очевидно, повинні відповідати на ваше запитання, ви також повинні зазначити, що те, як ви це робите, призведе до різного інтервалу на кожній машині. Залежить від того, наскільки швидко він може запустити компілятор.
IHazABо

Відповіді:


187

Ви також можете подивитися на Timerі TimerTaskкласи , які ви можете використовувати , щоб запланувати завдання для запуску кожні nсекунд.

Вам потрібен клас, який розширює TimerTaskта замінює public void run()метод, який буде виконуватися кожного разу, коли ви передаєте екземпляр цього класу timer.schedule()методу ..

Ось приклад, який друкується Hello Worldкожні 5 секунд: -

class SayHello extends TimerTask {
    public void run() {
       System.out.println("Hello World!"); 
    }
}

// And From your main() method or any other method
Timer timer = new Timer();
timer.schedule(new SayHello(), 0, 5000);

9
Зауважте, що 2-парам- scheduleметод буде виконаний один раз після зазначеної затримки. 3-парам scheduleабо scheduleAtFixedRateпотрібно було б використовувати.
Тім Бендер

2
хаха, так. Іноді я отримую голоси на відповіді, і я переглядаю, чи покращилось моє власне розуміння з моменту останнього заплутування через надання рішення.
Тім Бендер

4
@TimBender Тільки цікаво, чи дійсно ОП виконав своє завдання з цим;) У будь-якому разі, зараз я вважаю за краще використовувати ExecutorServiceдля цих завдань. Це дійсно велике поліпшення порівняно з традиційним API Thread. Просто не використовував його під час відповіді.
Rohit Jain

4
Timer timer = new Timer(true);повинно бути встановлене trueяк дімон. Якщо ви не хочете, щоб таймер все ще працював після закриття програми.
Томаш Муларчик

Це допомогло мені нарешті змусити мене зрозуміти і таймери. + 1.Утримуйте гарну роботу!
Даніель Торк

197

Якщо ви хочете робити періодичне завдання, використовуйте a ScheduledExecutorService. Спеціально ScheduledExecutorService.scheduleAtFixedRate

Код:

Runnable helloRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);

10
Я сподіваюся, що хтось інший також підтримає це. Thread.sleep () може найкраще вписати код в ОП, але це досить любительське відновлення колеса. Професійні інженери програмного забезпечення використовуватимуть перевірений та надійний API, наприклад, TimerTask. ScheduledExecutorService навіть краще; зверніться до спільноти Java Брайс Гетц та ін . Останній клас існує вже майже десятиліття - прикро, що всі ці інші відповіді його не помічають.
Майкл Шепер

2
@MichaelScheper, Дякую, я радий бачити, що ця відповідь нарешті перевершила TimerTaskваріант. Цікаво, що я помітив, що прийнята відповідь насправді не вірна: \ Вік двох API, окрім іншого, ScheduledExecutorServiceпросто більш інтуїтивно декларативний. Використання TimeUnitпараметра як значно більш зрозуміле, що відбувається. Пройшли дні подібного коду 5*60*1000 // 5 minutes.
Тім Бендер

2
@TimBender Я помітив, що у вас є аргумент 3 для періоду. Я не можу знайти, чи це в секундах чи мілісекундах. Я хотів би, щоб він працював кожні 500 мілісекунд (півсекунди).
ДжонМерліно

2
Ах, я бачу. Четвертий аргумент дозволяє вказати час, наприклад TimeUnit.MILLISECONDS.
ДжонМерліно

1
@TerryCarter У Java8 + Ви можете замість цього зробити Runnable helloRunnable = () -> { /*code */ };ще красивіше;)
Joel

39

Спробуйте зробити це:

Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
       System.out.println("Hello World");
    }
}, 0, 5000);

Цей код буде виконувати друк для консолі Hello World кожні 5000 мілісекунд ( 5 секунд). Для отримання додаткової інформації читайте https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


16

Я розгадую це за допомогою таймера, сподіваюся, що це допоможе. Я використовував таймер з java.util.Timerі TimerTaskз того ж пакета. Дивись нижче:

TimerTask task = new TimerTask() {

    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

Timer timer = new Timer();
timer.schedule(task, new Date(), 3000);

10

Можна використовувати Thread.sleep(3000)всередині для петлі.

Примітка. Для цього знадобиться try/catchблок.


6
public class HelloWorld extends TimerTask{

    public void run() {

        System.out.println("Hello World");
    }
}


public class PrintHelloWorld {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new HelloWorld(), 0, 5000);

        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("InterruptedException Exception" + e.getMessage());
            }
        }
    }
}

створюється нескінченна петля, задається завдання планувальника реклами.


4

Найпростішим способом було б встановити основний потік у режимі сну 3000 мілісекунд (3 секунди):

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
    System.out.println("Hello world!"):
}

Це зупинить нитку принаймні на X мілісекунд. Нитка могла б спати більше часу, але це залежить від JVM. Єдине, що гарантується - це те, що нитка спатиме хоча б ті мілісекунди. Погляньте на Thread#sleepдокумент:

Викликає поточний виконуваний потік спати (тимчасово припиняє виконання) протягом визначеної кількості мілісекунд, за умови точності та точності системних таймерів та планувальників .


Дякую @Luiggi. Java завжди переконається, що це 3000 мс незалежно від того, на якій машині (ЦП) я запускаю її правильно?
meiryo

@NandkumarTekale прагнете докладати більше?
meiryo

4
@meiryo Він зупинить нитку принаймні на X мілісекунд. Нитка могла б спати більше часу, але це залежить від JVM. Єдине, що гарантується - це те, що нитка спатиме хоча б ті мілісекунди.
Луїджі Мендоса

4
Застереження: якщо це не система в режимі реального часу, час сну буде щонайменше 3000 мс, але може бути і довшим. Якщо ви хочете спати рівно 3000 мс, особливо там, де загрожує життя людини (медичні інструменти, контрольні літаки тощо), ви повинні використовувати операційну систему в режимі реального часу.
Kinjal Dixit

1
@meiryo: Luiggi та kinjal дуже добре пояснили :)
Nandkumar Tekale

3

Використання java.util.Timerта Timer#schedule(TimerTask,delay,period)метод допоможуть вам.

public class RemindTask extends TimerTask {
    public void run() {
      System.out.println(" Hello World!");
    }
    public static void main(String[] args){
       Timer timer = new Timer();
       timer.schedule(new RemindTask(), 3000,3000);
    }
  }

2

Це простий спосіб використання теми в Java:

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(Exception e) {
        System.out.println("Exception : "+e.getMessage());
    }
    System.out.println("Hello world!");
}

1

Що він сказав. Ви можете обробляти винятки, як завгодно, але Thread.sleep (мілісекунди); найкращий шлях.

public static void main(String[] args) throws InterruptedException {

1

Ось ще один простий спосіб використання інтерфейсу Runnable в конструкторі теми

public class Demo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T1 : "+i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++) {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T2 : "+i);
                }
            }
        });

        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T3 : "+i);
                }
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}



-1
public class TimeDelay{
  public static void main(String args[]) {
    try {
      while (true) {
        System.out.println(new String("Hello world"));
        Thread.sleep(3 * 1000); // every 3 seconds
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.