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的使用。
我们定期让定时器抛异常
我们定期从控制台打印系统时间
代码如下(参考了网上的一些代码,在此表示感谢)
-
import
java.util.concurrent.ScheduledThreadPoolExecutor;
-
import
java.util.concurrent.TimeUnit;
-
-
-
public
class
TestScheduledThreadPoolExecutor {
-
-
public
static
void
main(String[] args) {
-
ScheduledThreadPoolExecutor exec=
new
ScheduledThreadPoolExecutor(
1
);
-
-
exec.scheduleAtFixedRate(
new
Runnable(){
-
@Override
-
public
void
run() {
-
throw
new
RuntimeException();
-
}},
1000
,
5000
, TimeUnit.MILLISECONDS);
-
-
exec.scheduleAtFixedRate(
new
Runnable(){
-
@Override
-
public
void
run() {
-
System.out.println(System.nanoTime());
-
}},
1000
,
2000
, TimeUnit.MILLISECONDS);
-
}
-
-
}
总结:是时候把你的定时器换成 ScheduledThreadPoolExecutor了
分享到:
相关推荐
Java并发工具包(java.util.concurrent)是Java编程中不可或缺的一部分,它为多线程环境提供了高效、安全且易用的工具。这个包包含了各种类和接口,帮助开发者编写高效的并发程序,避免了直接操作线程所带来的复杂性...
虽然`Timer` 类在许多情况下足够使用,但Java 5 引入的`java.util.concurrent` 包提供了更强大且线程安全的定时执行工具,如`ScheduledExecutorService` 和 `ScheduledThreadPoolExecutor`。这些类提供了更多的控制...
Java提供了一个高级的线程池接口——`java.util.concurrent.ExecutorService`,它是`Executor`接口的子接口,提供了管理线程和任务的更强大功能。`ExecutorService`的实现类包括`ThreadPoolExecutor`和`...
##### java.util.concurrent包下的类 - **ReentrantLock**:可重入锁,提供了比`synchronized`更灵活的锁定机制。 - **Semaphore**:信号量,用于控制同时访问特定资源的线程数量。 - **CountDownLatch**:倒计时...
Java提供了丰富的并发支持库,包括`java.util.concurrent`包中的各种类和接口,如`ExecutorService`、`Future`、`CountDownLatch`等。 #### 3. 线程安全 线程安全是并发编程中非常重要的一个概念,指多个线程访问...
Java中创建线程池的主要工具类是`java.util.concurrent.ExecutorService`,它提供了一种标准的方式创建不同类型的线程池。常用的线程池实现包括: 1. **FixedThreadPool**:创建固定大小的线程池,可以复用指定数量...
Java标准库中的`java.util.concurrent`包提供了强大的线程池功能支持,主要由`ExecutorService`接口及其实现类`ThreadPoolExecutor`和`Executors`工具类提供。 #### 二、Java线程池的三种类型 根据不同的应用场景...
这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor框架的设计理念是将任务的创建与任务的执行解耦,使得系统能够更好地管理和控制并发执行...
Java 8通过`java.util.concurrent.atomic`包提供了一组原子变量类,如`AtomicInteger`。 - **共享内存与消息传递**:并发程序通常采用两种模型:基于共享内存的模型和基于消息传递的模型。Java主要支持基于共享内存...
`Executor`框架是Java并发编程的重要组成部分,由`java.util.concurrent`包提供。它提供了一种更加灵活的方式来管理和执行任务,而不仅仅是简单的创建和启动线程。线程池通过重用已存在的线程来减少创建和销毁线程的...
Java Util Concurrency(JUC)是Java 5引入的一个强大库,它包括了锁、同步器、并发容器、线程池等并发工具。这些工具的设计目标是提高并发程序的性能和可维护性,减少编程错误,使开发者能够更容易地编写出高效、...