`

java.util.concurrent详解(三)ScheduledThreadPoolExecutor

    博客分类:
  • lock
阅读更多

6. ScheduledThreadPoolExecutor
    我们先来学习一下JDK1.5 API中关于这个类的详细介绍:

    "可另行安排在给定的延迟后运行命令,或者定期执行命令。需要多个辅助线程时,或者要求 ThreadPoolExecutor 具有额外的灵活性或功能时,此类要优于 Timer。
    一旦启用已延迟的任务就执行它,但是有关何时启用,启用后何时执行则没有任何实时保证。按照提交的先进先出 (FIFO) 顺序来启用那些被安排在同一执行时间的任务。

    虽然此类继承自 ThreadPoolExecutor,但是几个继承的调整方法对此类并无作用。特别是,因为它作为一个使用 corePoolSize 线程和一个无界队列的固定大小的池,所以调整 maximumPoolSize 没有什么效果。"

    在JDK1.5之前,我们关于定时/周期操作都是通过Timer来实现的。但是Timer有以下几种危险[JCIP]

a. Timer是基于绝对时间的。容易受系统时钟的影响。
b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响
c. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。

    如果你是使用JDK1.5以上版本,建议用ScheduledThreadPoolExecutor代替Timer。它基本上解决了上述问题。它采用相对时间,用线程池来执行TimerTask,会出来TimerTask异常。

    下面通过一个简单的实例来阐述ScheduledThreadPoolExecutor的使用。
  
    我们定期让定时器抛异常
    我们定期从控制台打印系统时间


代码如下(参考了网上的一些代码,在此表示感谢)

Java代码 复制代码  收藏代码
  1. import  java.util.concurrent.ScheduledThreadPoolExecutor;   
  2. import  java.util.concurrent.TimeUnit;   
  3.   
  4.   
  5. public   class  TestScheduledThreadPoolExecutor {   
  6.        
  7.      public   static   void  main(String[] args) {   
  8.         ScheduledThreadPoolExecutor exec= new  ScheduledThreadPoolExecutor( 1 );   
  9.            
  10.         exec.scheduleAtFixedRate( new  Runnable(){ //每隔一段时间就触发异常   
  11.              @Override   
  12.              public   void  run() {   
  13.                  throw   new  RuntimeException();   
  14.             }},  1000 5000 , TimeUnit.MILLISECONDS);   
  15.            
  16.         exec.scheduleAtFixedRate( new  Runnable(){ //每隔一段时间打印系统时间,证明两者是互不影响的   
  17.              @Override   
  18.              public   void  run() {   
  19.                 System.out.println(System.nanoTime());   
  20.             }},  1000 2000 , TimeUnit.MILLISECONDS);   
  21.     }   
  22.   
  23. }  

 

 


总结:是时候把你的定时器换成 ScheduledThreadPoolExecutor了

分享到:
评论

相关推荐

    java_util_concurrent_user_guide并发工具包详解

    Java并发工具包(java.util.concurrent)是Java编程中不可或缺的一部分,它为多线程环境提供了高效、安全且易用的工具。这个包包含了各种类和接口,帮助开发者编写高效的并发程序,避免了直接操作线程所带来的复杂性...

    Java中Timer的用法详解

    虽然`Timer` 类在许多情况下足够使用,但Java 5 引入的`java.util.concurrent` 包提供了更强大且线程安全的定时执行工具,如`ScheduledExecutorService` 和 `ScheduledThreadPoolExecutor`。这些类提供了更多的控制...

    手写线程文档

    Java提供了一个高级的线程池接口——`java.util.concurrent.ExecutorService`,它是`Executor`接口的子接口,提供了管理线程和任务的更强大功能。`ExecutorService`的实现类包括`ThreadPoolExecutor`和`...

    Java进阶知识点汇总.pdf

    ##### java.util.concurrent包下的类 - **ReentrantLock**:可重入锁,提供了比`synchronized`更灵活的锁定机制。 - **Semaphore**:信号量,用于控制同时访问特定资源的线程数量。 - **CountDownLatch**:倒计时...

    java高并发编程推荐超好的一本电子书

    Java提供了丰富的并发支持库,包括`java.util.concurrent`包中的各种类和接口,如`ExecutorService`、`Future`、`CountDownLatch`等。 #### 3. 线程安全 线程安全是并发编程中非常重要的一个概念,指多个线程访问...

    java 线程池

    Java中创建线程池的主要工具类是`java.util.concurrent.ExecutorService`,它提供了一种标准的方式创建不同类型的线程池。常用的线程池实现包括: 1. **FixedThreadPool**:创建固定大小的线程池,可以复用指定数量...

    java线程池

    Java标准库中的`java.util.concurrent`包提供了强大的线程池功能支持,主要由`ExecutorService`接口及其实现类`ThreadPoolExecutor`和`Executors`工具类提供。 #### 二、Java线程池的三种类型 根据不同的应用场景...

    Executor框架使用详解

    这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor框架的设计理念是将任务的创建与任务的执行解耦,使得系统能够更好地管理和控制并发执行...

    Mastering Concurrency Programming with Java 8

    Java 8通过`java.util.concurrent.atomic`包提供了一组原子变量类,如`AtomicInteger`。 - **共享内存与消息传递**:并发程序通常采用两种模型:基于共享内存的模型和基于消息传递的模型。Java主要支持基于共享内存...

    Android Executor线程池

    `Executor`框架是Java并发编程的重要组成部分,由`java.util.concurrent`包提供。它提供了一种更加灵活的方式来管理和执行任务,而不仅仅是简单的创建和启动线程。线程池通过重用已存在的线程来减少创建和销毁线程的...

    jucproject:JUC进阶

    Java Util Concurrency(JUC)是Java 5引入的一个强大库,它包括了锁、同步器、并发容器、线程池等并发工具。这些工具的设计目标是提高并发程序的性能和可维护性,减少编程错误,使开发者能够更容易地编写出高效、...

Global site tag (gtag.js) - Google Analytics