Executor框架是Java中用于高效管理线程的并发工具,核心接口为Executor,常用实现是ExecutorService,通过线程池统一调度任务。它支持Runnable和Callable任务提交,其中Future可用于获取异步执行结果。常见线程池包括固定大小、单线程、缓存型和定时线程池,推荐在生产环境中使用ThreadPoolExecutor手动配置以避免资源问题。使用完毕后需调用shutdown()关闭线程池,确保资源正确释放。

在Java并发编程中,直接使用线程(Thread)创建和管理任务会带来资源消耗大、难以控制并发数量等问题。为了解决这些问题,Java提供了Executor框架,它位于java.util.concurrent包中,是并发编程的重要工具。通过Executor框架,我们可以更高效、更安全地管理和调度线程。
什么是Executor框架?
Executor框架是一套用于统一创建、提交和执行任务的高级并发工具。它的核心接口是Executor,最常用的实现是ExecutorService,它可以管理线程池并提供任务调度能力。
简单来说,你不需要手动创建线程,而是把任务(Runnable或Callable)提交给线程池,由线程池来决定何时以及如何执行这些任务。
常见线程池类型
Java通过Executors工具类提供了几种常见的线程池实现:
立即学习“Java免费学习笔记(深入)”;
newFixedThreadPool(int nThreads):创建固定大小的线程池。当任务数超过线程数时,多余的任务会在队列中等待。 newSingleThreadExecutor():创建一个单线程的线程池,保证所有任务按顺序执行。 newCachedThreadPool():创建一个可缓存的线程池,线程数根据需要自动扩展,空闲线程会在60秒后被回收。 newScheduledThreadPool(int corePoolSize):支持定时及周期性任务执行的线程池。注意:虽然Executors提供了便捷的创建方式,但在生产环境中建议使用ThreadPoolExecutor手动配置参数,以避免潜在的资源耗尽问题(如newCachedThreadPool可能导致线程过多)。
基本使用示例
下面是一个使用ExecutorService执行任务的简单例子:
多个迹象表明你还是PHP菜鸟
我愿意把本文归入我的“编程糗事”系列。尽管在正规大学课程中,接触到软件工程、企业级软件架构和数据库设计,但我还是时不时地体会到下述事实带给我的“罪恶”感,当然,都是我的主观感受,并且面向Eclipse: 你是PHP菜鸟,如果你: 1. 不会利用如phpDoc这样的工具来恰当地注释你的代码 2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见 3
379 查看详情
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorExample { public static void main(String[] args) { // 创建一个包含3个线程的线程池 ExecutorService executor = Executors.newFixedThreadPool(3); // 提交多个任务 for (int i = 0; i { System.out.println("任务 " + taskId + " 正在由线程 " + Thread.currentThread().getName() + " 执行"); try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("任务 " + taskId + " 完成"); }); } // 关闭线程池 executor.shutdown(); try { if (!executor.awaitTermination(60, java.util.concurrent.TimeUnit.SECONDS)) { executor.shutdownNow(); } } catch (InterruptedException e) { executor.shutdownNow(); Thread.currentThread().interrupt(); } }}
这段代码创建了一个固定大小为3的线程池,并提交了5个任务。由于只有3个线程,最多同时运行3个任务,其余任务会排队等待。
Callable与Future获取返回值
除了Runnable,还可以使用Callable提交有返回值的任务。通过submit()方法返回的Future对象可以获取任务结果或检查执行状态。
import java.util.concurrent.*;public class CallableExample { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable task = () -> { System.out.println("正在计算..."); Thread.sleep(1000); return 42; }; Future future = executor.submit(task); System.out.println("任务已提交,等待结果..."); Integer result = future.get(); // 阻塞直到结果返回 System.out.println("结果是:" + result); executor.shutdown(); }}
在这个例子中,我们通过Future.get()获取异步任务的返回值。如果任务还未完成,调用get()会阻塞当前线程。
基本上就这些。掌握Executor框架能让你写出更清晰、高效的并发程序。合理使用线程池不仅能提升性能,还能避免系统资源被过度消耗。不复杂但容易忽略的是关闭线程池这个步骤,记得在程序结束前调用shutdown()。
以上就是Java并发编程中Executor框架入门的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1096055.html
微信扫一扫
支付宝扫一扫