如何每秒唤醒一个线程,Java

时间:2014-04-15 13:34:55

标签: java

我试图启动一个需要每秒执行一次任务的线程。 所以我从现在开始做的就是对这段代码进行循环:

// execute my task
..

lastScan.setTime(lastScan.getTime() + 1000);
long timeToSleep = (lastScan.getTime() - new Date().getTime());
try {
    Thread.sleep(timeToSleep);
} catch (InterruptedException e) {
    e.printStackTrace();
}

这有效,但我想知道是否有更优雅,更安全的东西,例如当当前日期到达给定时间时唤醒我的线程的函数。

提前感谢您的建议。

4 个答案:

答案 0 :(得分:3)

尝试使用ScheduledExecutorService

ScheduledExecutorService es = Executors.newScheduledThreadPool(10); //number of threads

从那里开始,类有不同的方法来传递Runnable对象,你可以在一个单独的线程中运行定时延迟

答案 1 :(得分:2)

我会选择:

 ScheduledThreadPoolExecutor

Scheduled Pool

答案 2 :(得分:2)

查看Java Timer类,这将有助于您更优雅地进行定时循环。

答案 3 :(得分:1)

你可以使用Timer和TimerTask, 这是一个每5秒打印同一行的示例代码

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class TimeReminder {
    Timer timer;

    public TimeReminder(int seconds) {
        timer = new Timer(); //At this line a new Thread will be created
        timer.schedule(new RemindTask(), Calendar.getInstance().getTime(), seconds * 1000);
    }

    class RemindTask extends TimerTask {

        @Override
        public void run() {
            System.out.println("ReminderTask is completed by Java timer");
        }
    }

    public static void main(String args[]) {

        new TimeReminder(5);
        System.out.println("Timertask is scheduled with Java timer.");
    }
}