public class Main {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Timer myTimer = new Timer();
        MyTimerTask myTask = new MyTimerTask();        myTimer.schedule(myTask,5000);  // 五秒之后运行run方法,但是却没有运行,为什么啊?
        try {
            Thread.sleep(5000);
        } catch (InterruptedException exc) {
        }
        myTimer.cancel();
    }
}import java.util.*;public class MyTimerTask extends TimerTask {    public void run() {
        System.out.println("Timer task executed.");
    }
}

解决方案 »

  1.   

     = = 。。我看了你的代码``不打印的原因很简单。。是因为这个  myTimer.schedule(myTask,5000); 执行要在5秒后。所以Timer应该为其启动了一个线程。。然后继续执行主线程。。之后因为 Thread.sleep(5000); 主线程也进入了休眠。。5秒之后主线程和Timer的那个线程同时苏醒,但是可能由于主线程的级别较高所以先执行了。。结果 myTimer.cancel(); 这个将你的任务取消了。。所以才没能打印出来。。
    如果你改成这样应该就会就明白了     public class Main {    /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            Timer myTimer = new Timer();
            MyTimerTask myTask = new MyTimerTask();        myTimer.schedule(myTask,5000);  // 五秒之后运行run方法,但是却没有运行,为什么啊?
            try {
                Thread.sleep(6000);
            } catch (InterruptedException exc) {
            }
            myTimer.cancel();
        }
    }
      

  2.   

    你sleep时间长一点试试,这个delay的时间不一定那么精确的
      

  3.   

    时间可能对不上
    把sleep改为6000试试或者把cancel取消
      

  4.   

    在调用TimerTask的时候新建了一个线程,而你在主进程里执行阻塞操作,且你延迟执行时间等于阻塞时间,所以看不到结果,如果你需要执行阻塞操作,可以在TimerTask线程中执行
      

  5.   

    2L 的回答很不错.的确是时间太过于精确了(这样导致线程唤醒后, 主线程立马执行cancel), 哪怕你设置5001, 结果也会正确的, 设置5000偶尔会正确打印(这估计是cancel方法还没来得及执行完全).
      

  6.   

    我查了下资料, 主线程和子线程默认情况下, 优先级应该是一致. 也就是说先后顺序不一定, CPU分配时间片不固定, 那如果先分配给子线程, 能打印正确, 先分配给主线程, 就不打印. 从这点来看, 也说明了为什么偶尔会打印正确. (纯属个人意见)