JCIP-22-Executor 框架, ExecutorService
2019年1月18日大约 12 分钟
在Java中,ThreadPoolExecutor是java.util.concurrent包下的一个类,用于创建和管理线程池以实现并发执行任务。它是Java提供的用于多线程编程的强大工具之一。
ThreadPoolExecutor提供了一种可配置的线程池实现,可以通过设置参数来控制线程池的大小、线程的创建和销毁方式,以及任务的执行策略等。
它是ExecutorService接口的实现类,提供了一系列方法来提交任务并处理线程池中的任务执行。
下面是一个简单的使用ThreadPoolExecutor的示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class ThreadPoolExecutorExample {
public static void main(String[] args) {
// 创建一个具有固定线程数的线程池
ExecutorService executor = Executors.newFixedThreadPool(4);
// 提交任务给线程池
for (int i = 0; i {
// 执行任务逻辑
System.out.println("Task " + taskId + " is executing.");
});
}
// 关闭线程池
executor.shutdown();
}
}
在JDK1.5之前,我们关于定时/周期操作都是通过Timer来实现的。
但是Timer有以下几种危险
a. Timer是基于绝对时间的。容易受系统时钟的影响。
b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响
c. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。
如果你是使用JDK1.5以上版本,建议用ScheduledThreadPoolExecutor代替Timer。它基本上解决了上述问题。它采用相对时间,用线程池来执行TimerTask,会出来TimerTask异常。
有些接口查询反馈结果是异步返回的,无法立刻获取查询结果。
触发异步操作,然后传递一个唯一标识。
等到异步结果返回,根据传入的唯一标识,匹配此次结果。
正常的应用场景很多,但是有时候不想做数据存储,只是想简单获取调用结果。
即想达到同步操作的结果,怎么办呢?
发起异步操作
在异步结果返回之前,一直等待(可以设置超时)
结果返回之后,异步操作结果统一返回