当前位置: 代码迷 >> J2SE >> java timer的使用有关问题 100分
  详细解决方案

java timer的使用有关问题 100分

热度:1381   发布时间:2013-02-25 00:00:00.0
java timer的使用问题 100分
本帖最后由 valid26 于 2012-11-12 11:42:55 编辑 下面一段代码 是要当前时间的第二天早上9点整 输出一句get in timer!!!!
可是我运行代码后,把系统时间调到第二天8点59分58秒,过了2秒什么反应也没有。
但是我把c.add(Calendar.DATE, 1);这句去掉,把系统时间改成8点59分45秒,再运行程序,过一会就输出了。

求大侠指点 急用 谢谢


public class Cs {
public static SimpleDateFormat sd = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");

public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, 1);
c.set(Calendar.HOUR_OF_DAY, 9);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
Date time = c.getTime();
Timer timer = new Timer();
System.out.println("1: " + sd.format(time));
timer.schedule(new TimerTask() {
public void run() {
System.out.println("get in timer!!!!");
}
}, time);
}

}


------最佳解决方案--------------------------------------------------------
这个问题不好解决。。。

在Timer内部,它是先计算下一次任务距离现在还有多少毫秒,然后直接执行 Object.wait(毫秒数),这样就不需要频繁去检测现在时间跟任务时间的差距,节省开销。

而你修改系统时间,应该是不会影响这个passby的wait(毫秒数)的,否则时钟就全错乱了。

关键代码是:

    private void mainLoop() {
        while (true) {
            try {
                TimerTask task;
                boolean taskFired;
                synchronized(queue) {
                    // Wait for queue to become non-empty
                    while (queue.isEmpty() && newTasksMayBeScheduled)
                        queue.wait();
                    if (queue.isEmpty())
                        break; // Queue is empty and will forever remain; die

                    // Queue nonempty; look at first evt and do the right thing
                    long currentTime, executionTime;
                    task = queue.getMin(); // 得到最近所需执行的任务
                    synchronized(task.lock) {
                        if (task.state == TimerTask.CANCELLED) {
                            queue.removeMin();
  相关解决方案