Печатайте «привет, мир» каждые 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
Хотя приведенные ниже ответы, очевидно, должны ответить на ваш вопрос, вы также должны отметить, что то, как вы это делаете, приведет к разному интервалу на каждой машине. Зависит от того, насколько быстро он может запустить компилятор.
IHazABone

Ответы:


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
Обратите внимание, что метод с двумя параметрами scheduleбудет выполняться один раз после указанной задержки. Необходимо использовать 3 параметра scheduleили scheduleAtFixedRate.
Тим Бендер

2
лол, да. Иногда я получаю голоса за ответы и пытаюсь найти, что мое собственное понимание улучшилось с тех пор, как я в последний раз запутался, предлагая решение.
Тим Бендер

4
@TimBender Просто интересно, действительно ли OP выполнил свою задачу с этим;) В любом случае, теперь я бы предпочел использовать ExecutorServiceдля этих задач. Это действительно большое улучшение по сравнению с традиционным Thread API. Просто не использовал его на момент ответа.
Рохит Джайн

4
Timer timer = new Timer(true);должен быть установлен trueкак deamon. Если вы не хотите, чтобы таймер продолжал работать после закрытия приложения.
Tomasz Mularczyk

Это помогло мне, наконец, понять и таймеры. + 1. Продолжайте работать хорошо!
Дэниел Торк,

198

Если вы хотите выполнять периодическую задачу, используйте файл 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 () может лучше всего соответствовать коду OP, но это довольно любительское переосмысление колеса. Профессиональные инженеры-программисты будут использовать проверенный и проверенный API, такой как TimerTask. ScheduledExecutorService даже лучше; см. книгу Брайана Гетца и др. « Java Concurrency in Practice» . Последний класс существует уже почти десять лет - печально, что все остальные ответы не учитывают его.
Майкл Шепер

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

2
@TimBender Я заметил, что у вас есть 3 для аргумента периода. Я не могу найти, в секундах или миллисекундах. Я бы хотел, чтобы он запускался каждые 500 миллисекунд (полсекунды).
JohnMerlino

2
АА, вижу. Четвертый аргумент позволяет указать время, например TimeUnit.MILLISECONDS.
JohnMerlino

1
@TerryCarter В Java8 + Вместо этого вы можете сделать Runnable helloRunnable = () -> { /*code */ };что-то еще красивее;)
Джоэл

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)внутри цикла for.

Примечание: для этого потребуется 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 мс, особенно там, где существует опасность для жизни людей (медицинские инструменты, управляющие самолеты и т. Д.), Вам следует использовать операционную систему реального времени.
Кинджал Диксит

1
@meiryo: Луигги и кинджал очень хорошо объяснились :)
Нандкумар Текале

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 в Thread Constructor

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

Для небольших приложений можно использовать Timer и TimerTask, как упоминал Рохит, но в веб-приложениях я бы использовал Quartz Scheduler для планирования заданий и выполнения таких периодических заданий.

См. Руководства по планированию Quartz.


-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.