分享

如何暂停/重启(Pause/Restart)一个TimerTask而不是销毁/新建(Cancel/Renew)一个TimerTask

 旭龙 2012-09-18
直接在TimerTask中使用cancel()方法将其暂停后,
似乎无法直接再让它重新启动起来(直接在Timer中schedule这个已经cancel的timertask会抛出IllegalStateException异常)。

实际需求为:
1. TimerTask中的run方法可以控制该TimerTask进入暂停状态
2. TimerTask进入暂停状态后,可以在其他类中调用某方法重新激活该TimerTask,使其进入定期运行状态


#1楼 得分:9回复于:2009-02-25 10:06:38
楼主可以将Timer换成多线程的啊....
在使用多线程时,使用一个标志来决定是否运行....


#3楼 得分:100回复于:2009-02-25 10:33:21
Java code
import java.util.Timer;
import java.util.TimerTask;


public class Test1 {
    public static void main(String[] args) {
        final MyTimerTask task = new MyTimerTask();
        new Timer().scheduleAtFixedRate(task, 0, 1000);

        Thread thread = new Thread() {
            public void run() {
                while(true) {
                    try {
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    synchronized (task) {
                        task.condition = true;
                        System.out.println("notify...");
                        task.notifyAll();
                    }
                }



            };
        };
        thread.start();
    }
}

class MyTimerTask extends TimerTask{
    public volatile boolean condition = false;

    public void run() {
        synchronized (this) {
            while(!condition) {
                System.out.println("Waiting...");
                try {
                    wait();
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }

            }

        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Continue task...Done.");
        condition = false;
    }
}

#6楼 得分:0回复于:2009-02-25 14:38:15
请问MT502  (3#)

如下这段代码中:
Java code
synchronized (task) { task.condition = true; System.out.println("notify..."); task.notifyAll(); }


为什么要将task加到同步块中?
这个synchronized的具体作用是什么?
我试着去掉同步,结果会抛出“java.lang.IllegalMonitorStateException”异常。


#7楼 得分:40回复于:2009-02-25 14:41:41
引用 6 楼 talent_marquis 的回复:
请问MT502 

如下这段代码中: 

Java code
synchronized (task) {
task.condition = true;
System.out.println("notify...");
task.notifyAll();
}




为什么要将task加到同步块中? 
这个synchronized的具体作用是什么? 
我试着去掉同步,结果会抛出“java.lang.IllegalMonitorStateException”异常。

这是因为要调用某个对象的notify,wait方法,必须拥有该对象的监视锁,而该监视锁可以通过synchronized该对象获得。

#8楼 得分:0回复于:2009-02-25 16:30:04
非常感谢!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多