Печатайте «привет, мир» каждые 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 секунды?

Meiryo
источник
1
Хотя приведенные ниже ответы, очевидно, должны ответить на ваш вопрос, вы также должны отметить, что то, как вы это делаете, приведет к разному интервалу на каждой машине. Зависит от того, насколько быстро он может запустить компилятор.
IHazABone
Возможный дубликат вызова функции каждые 10 минут
Alex.K.

Ответы:

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);
tmwanik
источник
10

Вы можете использовать Thread.sleep(3000)внутри цикла for.

Примечание: для этого потребуется try/catchблок.

saum22
источник
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());
            }
        }
    }
}

создан бесконечный цикл, настроена задача планировщика объявлений.

Vicky
источник
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!");
}
user3928455
источник
1

Что он сказал. Вы можете обрабатывать исключения как хотите, но Thread.sleep (миллисекунды); это лучший маршрут.

public static void main(String[] args) throws InterruptedException {
leigero
источник
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();
    }
}
Маюр Чудасама
источник
0

Добавить Thread.sleep

try {
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
Рассел Гутьеррес
источник
-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();
    }
  }
}
user3017805
источник