import java.util.Timer;
public class test3 { public static Timer timer = null; static {
timer = new Timer("czk");
} public static Timer getTimer() {
if (timer != null) {
return timer;
} else {
return null;
}
} public static void setSleep() throws Exception {
if (timer != null) {
timer.cancel();
}
}
}
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.czk.main.test3;public class Listener implements ServletContextListener {

private Timer timer = test3.getTimer();
public void contextDestroyed(ServletContextEvent e) { timer.cancel();
}
} } public void contextInitialized(ServletContextEvent e) { timer.schedule(Inspection(), 0, 500);
}

private TimerTask Inspection() { TimerTask tt = new TimerTask() { @Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
System.out.println(i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
return tt;
}
}应用启动时候会执行这个定时器,循环打印1-100.
但是怎么去停止呢。import java.util.Timer;
public class test { public static void main(String[] args) throws Exception {

Timer timer1 = test3.getTimer();
Timer timer2 = test3.getTimer();
Timer timer3 = test3.getTimer();
System.out.println(timer1.equals(timer2));
System.out.println(timer1.equals(timer3));
timer1.cancel();
}
}打印的都是true。
timer1,timer2,timer3 的引用都是一样的。
请教高手怎么去停止。

解决方案 »

  1.   

    应用是怎么启动的是关键。取消一个线程contextDestroyed方法三个对象引用一样是因为你的定时器对象在静态块中被创建(只会创建一次,以后的对象都直接在静态池里面拿)
      

  2.   


    启动tomcat 就启动了。 怎么停止啊。
      

  3.   

    import java.util.Timer;
    public class test { 
        public static void main(String[] args) throws Exception {
             
            Timer timer1 = test3.getTimer();
            Timer timer2 = test3.getTimer();
            Timer timer3 = test3.getTimer();
            System.out.println(timer1.equals(timer2));
            System.out.println(timer1.equals(timer3));
            timer1.cancel();
        }
    }我这样停不行吗。为什么呢
    怎么停都可以。只要能停。停了之后还能重新启动不?
      

  4.   


    public class Main {
        public static void main(String[] args) {
            Timer timer = new Timer();
            timer.schedule(new DateTask(), 5000);
            System.out.println("现在时间:" + new Date());        try {
                Thread.sleep(8000);
            }
            catch(InterruptedException e) {
            }        timer.cancel(); //停了
        }
    }
      

  5.   

    timer1.cancel(); 就表示已经取消了
    想重新开始,应该再次把task加进来。
    timer.schedule(Inspection(), 0, 500);   不是很明白你要干什么
      

  6.   

    或者
    保存每个TimerTask的引用,然后在需要停止时调用timerTask.cancel();