`
zhangwei_david
  • 浏览: 470747 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ScheduledThreadPoolExecutor与Timer

 
阅读更多

    Timer类负责管理延迟任务以及周期任务。然而,Timer存在一些固有的缺陷。
    Timer 在执行定时任务时只会创建一个后台线程。如果某个线程执行的时间过长,那么将破会其他定时任务的精确性。
   Timer的另一个问题是,如果TimerTask抛出一个非检查异常,由于Timer不捕获异常导致终止定时任务线程。在这样情况下,Timer无法恢复线程的执行,而是错误地认为整个Timer都被取消了。因此,已经被调度但尚未执行的TimerTask将不会再被执行,新的任务也不能被调度。

   Timer支持基于绝对时间而不是相对时间的调度机制,因此任务的执行对系统时间的变化很敏感。



ScheduledThreadPoolExecutor在调度多个定时任务时要好于Timer。

   ScheduledThreadPoolExecutor 只支持相对时间的调度。

 

 

 

 

import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author zhangwei_david
 * @version $Id: Ten.java, v 0.1 2014年11月12日 下午3:30:39 zhangwei_david Exp $
 */
public class Newline extends TimerTask {

    /**
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
        }
        System.out.println("\r\n");
    }

}

 

import java.util.TimerTask;

/**
 *
 * @author zhangwei_david
 * @version $Id: One.java, v 0.1 2014年11月12日 下午3:29:31 zhangwei_david Exp $
 */
public class print extends TimerTask {

    /**
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
        System.out.print("-");
    }

}

import java.util.TimerTask;

/**
 *
 * @author zhangwei_david
 * @version $Id: Stop.java, v 0.1 2014年11月12日 下午4:16:50 zhangwei_david Exp $
 */
public class Stop extends TimerTask {

    /**
     * @see java.util.TimerTask#run()
     */
    @Override
    public void run() {
        throw new RuntimeException("运行异常");
    }

}

 

import java.util.Date;
import java.util.Timer;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author zhangwei_david
 * @version $Id: TimerClient.java, v 0.1 2014年11月12日 下午3:31:00 zhangwei_david Exp $
 */
public class TimerClient {
    public static void main(String[] args) {
        Timer timer = new Timer();
        Date d = new Date();
        timer.schedule(new print(), d, TimeUnit.SECONDS.toMillis(2));
        timer.schedule(new Newline(), d, TimeUnit.SECONDS.toMillis(4));
        timer.schedule(new Stop(), TimeUnit.MINUTES.toMillis(1));
    }
}

 执行结果是:

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-Exception in thread "Timer-0" java.lang.RuntimeException: 运行异常
	at com.cathy.demo.concurrency.schedule.Stop.run(Stop.java:21)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)

 

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author zhangwei_david
 * @version $Id: ScheduledThreadClient.java, v 0.1 2014年11月12日 下午3:47:37 zhangwei_david Exp $
 */
public class ScheduledThreadClient {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        ScheduledExecutorService ses = new ScheduledThreadPoolExecutor(10);
        ses.scheduleAtFixedRate(new print(), 0, 2, TimeUnit.SECONDS);
        ses.scheduleAtFixedRate(new Newline(), 2, 4, TimeUnit.SECONDS);
        ses.scheduleWithFixedDelay(new Stop(), 1, 1, TimeUnit.MILLISECONDS);
    }

}

 结果是:

---

--

--

--

--

--

--

--

--

--

--

--

--

--

--

--

--

--

-

 

 

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics