每X秒打印一次“ hello world”


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中的任何计时器库。一个怎样说上面的内容每三秒钟打印一次?


1
尽管以下答案显然可以回答您的问题,但您还应该注意,这样做的方式会导致每台计算机的间隔不同。取决于其运行编译器的速度。
IHazABone 2014年

Answers:


187

您还可以查看TimerTimerTask类,这些类可用于计划任务每​​秒钟运行一次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-param schedule方法将在指定的延迟后执行一次。3-param schedulescheduleAtFixedRate将需要使用。
Tim Bender 2014年

2
哈哈,是啊。有时,我会对答案进行投票,然后去寻找自从我上次提供解决方案以来我的理解得到了改善。
蒂姆·本德2014年

4
@TimBender只是想知道OP是否真的以此完成了他的任务;)无论如何,现在我更愿意使用ExecutorService这些任务。与传统的Thread API相比,这确实是一个很大的改进。只是在回答时没有使用它。
罗希特·贾因

4
Timer timer = new Timer(true);应该设置true为恶魔。除非您希望计时器在关闭应用程序后仍在运行。
Tomasz Mularczyk 2015年

这最终帮助我最终使我也了解了计时器。+ 1。保持良好的工作!
丹尼尔·托克

197

如果要执行定期任务,请使用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更好。请参阅Brian Goetz等人的Java Concurrency in Practice。后一类已经存在了将近十年了,可悲的是所有其他答案都忽略了它。
Michael Scheper

2
@MichaelScheper,谢谢,我很高兴看到这个答案终于超过了TimerTask变体。有趣的是,我注意到接受的答案实际上是不正确的:\除了两个API的使用期限,ScheduledExecutorService更直观的是声明性的。使用TimeUnitas作为参数可以使事情更加清楚。像这样的代码时代已经一去不复返了5*60*1000 // 5 minutes
Tim Bender 2014年

2
@TimBender我注意到您的period参数为3。我找不到是以秒还是毫秒为单位的。我希望它每500毫秒(半秒)运行一次。
JohnMerlino 2014年

2
啊,我明白了。第四个参数使您可以指定时间,例如TimeUnit.MILLISECONDS。
JohnMerlino 2014年

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);

这段代码每隔5000毫秒(5秒)将运行一次print来控制台Hello World。有关更多信息,请阅读https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


16

我想出一个计时器,希望对您有所帮助。我从使用的计时器java.util.TimerTimerTask来自同一个包。见下文:

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。不管我在什么机器(CPU)上运行Java,Java都会始终确保它是3000毫秒?
meiryo 2012年

@NandkumarTekale想详细说明吗?
meiryo 2012年

4
@meiryo它将停止线程至少X毫秒。该线程可能需要更多时间,但这取决于JVM。唯一可以保证的是线程将至少休眠几毫秒。
路易吉·门多萨

4
注意:如果不是实时系统,则睡眠时间至少为3000毫秒,但可能会更长。如果您想精确地睡眠3000毫秒,尤其是在有生命危险的地方(医疗器械,飞机控制等),则应使用实时操作系统。
Kinjal Dixit 2012年

1
@meiryo:Luiggi和kinjal很好地解释了:)
Nandkumar Tekale,2012年

3

使用java.util.TimerTimer#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(miliseconds); 是最好的选择。

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();
    }
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.