Java并发之线程池Executor框架的深入理解
什么是Executor框架?
Executor框架是Java提供的一种开发并发程序的机制。在Java中,通常我们需要实现多线程的程序来提高程序执行效率,但是如果使用Java中的Thread类直接去开启线程,可能会导致线程执行不可控、线程消耗过多的系统资源等问题。
Executor框架的出现解决了这些问题。它将任务的提交与执行进行分离,任务提交者无需关注任务是如何被执行的,而执行者只需要按照一定的规则执行任务即可。
Executor框架的主要组成部分
- 任务队列(线程池)
- 任务接口ExecutorService
- 任务调度器ScheduledExecutorService
- 工厂类Executors
任务队列(线程池)
线程池主要包含两个部分:工作线程和阻塞队列。工作线程负责执行任务,而阻塞队列则用于存储等待执行的任务。
线程池在创建时通常会指定线程池中的最大线程数、线程池的名称、线程的存活时间等参数,以此来实现对线程资源的控制与管理。
任务接口ExecutorService
ExecutorService是一个接口,继承自Executor接口。ExecutorService可以提交Runnable、Callable类型的任务,并返回Future类型的结果。
ExecutorService提供了一系列提交任务的方法。其中submit()方法可以提交一个Runnable或者Callable类型的任务,而execute()则只能提交Runnable类型的任务。
任务调度器ScheduledExecutorService
ScheduledExecutorService继承自ExecutorService接口,它提供了一系列定时执行任务的方法,比如scheduleAtFixedRate()、scheduleWithFixedDelay()等。
工厂类Executors
Executors是Java提供的一个工厂类,用于快速创建各种类型的线程池。它提供了一些静态工厂方法,可以方便地创建一个单线程、固定大小、可缓存的线程池等。
示例说明
示例1:固定大小线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 0; i < 10; i++) {
final int taskNum = i;
executorService.execute(new Runnable() {
public void run() {
System.out.println("线程名称:" + Thread.currentThread().getName() + ",任务编号:" + taskNum);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
在本示例中,我们创建了一个固定大小为2的线程池,并向线程池提交了10个任务。从输出可以看出,线程池中最多存在两个线程,且会执行完所有任务后自动关闭线程池。
示例2:定时执行任务
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("当前时间:" + new Date());
}
}, 0, 3, TimeUnit.SECONDS);
在本示例中,我们创建了一个固定大小为1的定时任务线程池,并向线程池提交了一个任务。这个任务将会每隔3秒输出一次当前的时间。
总结
Executor框架是Java提供的一种解决多线程问题的方案。它通过线程池、任务接口、任务调度器和工厂类等组成部分的协作,实现了对线程资源的管理和任务的调度。开发者们可以根据不同的需求使用不同的Executor类去实现自己需要的定制化线程池。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发之线程池Executor框架的深入理解 - Python技术站