143

最近我一直在使用大数字循环来打印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 秒打印一次?

4

14 回答 14

228

如果要执行定期任务,请使用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);
于 2012-10-16T06:04:25.673 回答
209

您还可以查看可用于安排任务每秒钟运行的Timer类。TimerTaskn

您需要一个扩展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);
于 2012-10-16T06:05:06.983 回答
44

尝试这样做:

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

此代码将每5000毫秒(5秒)运行打印到控制台Hello World 。有关更多信息,请阅读https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html

于 2015-07-24T06:37:31.550 回答
17

我用计时器解决了这个问题,希望对您有所帮助。我使用了来自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);
于 2012-10-16T06:16:42.277 回答
9

您可以使用Thread.sleep(3000)内部 for 循环。

注意:这将需要一个try/catch块。

于 2012-10-16T06:02:28.003 回答
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());
            }
        }
    }
}

无限循环被创建广告调度任务被配置。

于 2013-05-01T05:58:38.673 回答
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文档:

使当前执行的线程在指定的毫秒数内休眠(暂时停止执行),具体取决于系统计时器和调度程序的精度和准确性

于 2012-10-16T06:01:24.133 回答
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);
    }
  }
于 2012-10-16T06:07:04.720 回答
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!");
}
于 2014-08-11T06:08:16.877 回答
1

他说的。你可以随心所欲地处理异常,但是 Thread.sleep(miliseconds); 是最好的路线。

public static void main(String[] args) throws InterruptedException {
于 2012-10-16T06:09:13.873 回答
1

这是在 Thread Constructor 中使用 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();
    }
}
于 2014-08-11T06:25:12.067 回答
0

添加Thread.sleep

try {
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
于 2012-10-16T06:01:52.527 回答
0

对于小型应用程序,可以使用 Rohit 提到的 Timer 和 TimerTask,但在 Web 应用程序中,我会使用Quartz Scheduler来安排作业并执行此类周期性作业。

请参阅Quartz 调度教程

于 2012-10-16T06:16:05.963 回答
-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();
    }
  }
}
于 2014-04-29T15:20:47.427 回答