10004---java并发编程--Executor框架
发布日期:2021-06-28 19:52:19 浏览次数:2 分类:技术文章

本文共 2488 字,大约阅读时间需要 8 分钟。

Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,

其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:

tu

并发编程的一种编程方式是把任务拆分为一系列的小任务,即Runnable,然后在提交给一个Executor执行,

Executor.execute(Runnalbe) 。Executor在执行时使用内部的线程池完成操作。

一、创建线程池

Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。

public static ExecutorService newFixedThreadPool(int nThreads)

    创建固定数目线程的线程池。

public static ExecutorService newCachedThreadPool()

   创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,

  则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

public static ExecutorService newSingleThreadExecutor()

  创建一个单线程化的Executor。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

  创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

Executor executor = Executors.newFixedThreadPool(10);Runnable task = new Runnable() {	@Override	public void run() {		System.out.println("task over");	}};executor.execute(task);executor = Executors.newScheduledThreadPool(10);ScheduledExecutorService scheduler = (ScheduledExecutorService) executor;scheduler.scheduleAtFixedRate(task, 10, 10, TimeUnit.SECONDS);

二、ExecutorService与生命周期

ExecutorService扩展了Executor并添加了一些生命周期管理的方法。一个Executor的生命周期有三种状态,运行关闭终止

Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,处于关闭状态,isShutdown()方法返回true。

这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor处于终止状态,isTerminated()返回true。

如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException。

ExecutorService executorService = (ExecutorService) executor;while (!executorService.isShutdown()) {	try {		executorService.execute(task);	} catch (RejectedExecutionException ignored) {			}}executorService.shutdown();

三、使用Callable,Future返回结果

Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>和Runable<V>。Callable代表一个有返回值得操作。

Callable
func = new Callable
(){ public Integer call() throws Exception { System.out.println("inside callable"); Thread.sleep(1000); return new Integer(8); } }; FutureTask
futureTask = new FutureTask
(func); Thread newThread = new Thread(futureTask); newThread.start(); try { System.out.println("blocking here"); Integer result = futureTask.get(); System.out.println(result); } catch (InterruptedException ignored) { } catch (ExecutionException ignored) { }

 ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。

如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

例子:并行计算数组的和。



转载地址:https://blog.csdn.net/xxxcyzyy/article/details/50549076 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:10005---海量数据排序总结
下一篇:10028---Java数据类型总结

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月01日 07时54分24秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【leetcode之旅】 数组 - 414.第三大的数 2019-04-28
【leetcode之旅】 数组 - 448.找出所有数组消失的数 2019-04-28
【leetcode之旅】 数组 - 485.最大连续1的个数 2019-04-28
【leetcode之旅】 数组 - 561.数组拆分I 2019-04-28
Android面试必问!我的移动开发春季历程,大厂内部资料 2019-04-28
Android面试送分题:来看看移动端小程序技术的前世今生!附赠课程+题库 2019-04-28
Android面试题整理,46道面试题带你了解中高级Android面试,顺利通过阿里Android岗面试 2019-04-28
上海大厂Android面试经历:Android多线程实现方式及并发与同步,年薪超过80万! 2019-04-28
从入门到精通!已成功拿下字节、腾讯、脉脉offer,看看这篇文章吧! 2019-04-28
金九银十Android热点知识!如何快速的开发一个完整的直播app,内含福利 2019-04-28
金九银十Android热点知识!字节跳动移动架构师学习笔记,面试真题解析 2019-04-28
阿里P7亲自教你!34岁安卓开发大叔感慨,Android面试题及解析 2019-04-28
阿里P7大佬手把手教你!系统盘点Android开发者必须掌握的知识点,系列篇 2019-04-28
阿里P7大牛手把手教你!十多家大厂Android面试真题锦集干货整理,聪明人已经收藏了! 2019-04-28
阿里P7大牛整理!腾讯+字节+阿里面经真题汇总,书籍+视频+学习笔记+技能提升资源库 2019-04-28
android面试准备中高级简书!致Android高级工程师的一封信,内含福利 2019-04-29
Android面试回忆录:2个月面试腾讯、B站、网易等11家公司的面经总结!3面直接拿到offer 2019-04-29
Android面试回忆录:在字节跳动我是如何当面试官的,面试心得体会 2019-04-29
Android面试总结,GitHub标星9K的Google官方MVP+Rxjava项目详解,算法太TM重要了 2019-04-29
android面试题!看懂这份Android面经大厂真不是问题!不吃透都对不起自己 2019-04-29