第六章并发编程,异步执行框架executor
异步执行框架executor是一个接口,只有一个方法。接受一个Runnable做为参数,执行任务。 将任务的执行与提交解耦。
1:executor
package java.util.concurrent;
public interface Executor {
void execute(Runnable var1);
}
2:使用executor 创建一个任务,并执行。
package chaptor06; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; public class TaskExecutionWebServer {
private static final int NTHREADS=100;
private static final Executor exec = Executors.newFixedThreadPool(NTHREADS); public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(100); while (true) {
final Socket connection=serverSocket.accept();
Runnable task=new Runnable() { //Runnable 不处理异常,callable 处理异常。
@Override
public void run() {
//handlerRequest (connection);
}
}; exec.execute(task); //将Runnable 交给executor
}
}
}
3:因为executor不能对线程进行进行操作,例如终止等。所以executorService继承了 executor。executorService 可以接收callable对象,callable能够处理异常。
能够返回含有将来结果的 future等。能够使该框架执行的线程终止。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package java.util.concurrent; import java.util.Collection;
import java.util.List; public interface ExecutorService extends Executor {
void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long var1, TimeUnit var3) throws InterruptedException; <T> Future<T> submit(Callable<T> var1); <T> Future<T> submit(Runnable var1, T var2); Future<?> submit(Runnable var1); <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1) throws InterruptedException; <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException; <T> T invokeAny(Collection<? extends Callable<T>> var1) throws InterruptedException, ExecutionException; <T> T invokeAny(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException, ExecutionException, TimeoutException;
}
4:completionService将executor和blockingqueue的功能融合在一起,可以将(一组)callable任务交给它,然后用take和poll方法获得结果future。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package java.util.concurrent; public interface CompletionService<V> {
Future<V> submit(Callable<V> var1); Future<V> submit(Runnable var1, V var2); //提交任务 Future<V> take() throws InterruptedException; //获得结果 Future<V> poll(); Future<V> poll(long var1, TimeUnit var3) throws InterruptedException;
}
5:为任务设置时限,
当某个任务获得的结果超过一定时间时,就舍弃它,可以通过future.get方法实现。传递给一个时间限制。
V get(long var1, TimeUnit var3) throws InterruptedException, ExecutionException, TimeoutException;
6:当一组任务提交,访问不同网站的数据库等,可以设置一个时限,当到达时限时,只要取到的结果,如果某些任务没有取到结果,那么将它们舍弃。可以用executorService中的invokeall方法。
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException;
ExecutorService 构建多线程生产者消费者
第六章并发编程,异步执行框架executor的更多相关文章
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- [CSAPP笔记][第十二章并发编程]
第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...
- CSAPP:第十二章 并发编程
CSAPP:第十二章 并发编程 12.1 线程执行模型12.2 多线程之间并发通信12.3 其他并发问题 使用应用级并发的应用程序称为并发程序.现代操作系统提供三种基本的构造并发程序的方法: 进程 ...
- C++笔记-并发编程 异步任务(async)
转自 https://www.cnblogs.com/diysoul/p/5937075.html 参考:https://zh.cppreference.com/w/cpp/thread/lock_g ...
- C++并发编程 异步任务
C++并发编程 异步任务 异步任务 std::async (1) std::async 会返回一个 std::future 对象, 这个对象持有最终计算出来的结果. 当需要这个值时, 只需要调用对象的 ...
- 并发编程学习笔记(15)----Executor框架的使用
Executor执行已提交的 Runnable 任务的对象.此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节.调度等)分离开来的方法.通常使用 Executor 而不是显式地创建 ...
- Java 并发编程 -- Fork/Join 框架
概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...
- java并发编程(十七)Executor框架和线程池
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17465497 Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动 ...
- 《C#并发编程经典实例》学习笔记-第一章并发编程概述
并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...
随机推荐
- MathType编辑物理单位的方法
在用MathType编辑物理公式时,由于物理单位很多都是复合单位,所以在编辑时如果能够有这种复合单位直接使用的话,编辑效率就会大大提高.实际上这种想法在MathType中是可行的,MathType中也 ...
- VC++ ToolTip的简单使用
1.在基于对话框的MFC应用程序中使用Tooltip,首先在Dlg类的头文件中定义一个变量: CToolTipCtrl m_iToolTips; 2.在Dlg类的OnInitDialog中添加代码: ...
- VMWare虚拟机提示:打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机
将电脑上存在的虚拟机复制一份后打开运行,弹出错误提示: 打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机. 解决方法如下: 打开存放虚拟机系统硬盘的所在文件夹 ...
- C#操作MSMQ(消息队列)
using System; using System.Collections.Generic; using System.Text; using System.Messaging; using Sys ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)
接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...
- 查询软件和硬件列表清单[将文章里代码另存为 list.vbs,双击运行就会出现一个html页面]
'==========================================================================' Name: 查询软件和硬件列表清单' 不支持W ...
- 使用fetch出现unexpected end of input 解决方法
传统的ajax(即xmlhttprequest)由于使用叫复杂,于是js新推出了fetch来获取后台数据,无需引进jq的$.ajax,也可以使用promise的链式用法去处理回调地狱,着实很方便,在谷 ...
- django 文档
django 学习文档 https://yiyibooks.cn/xx/django_182/index.html
- 十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
- Docker源码分析(七):Docker Container网络 (上)
1.前言(什么是Docker Container) 如今,Docker技术大行其道,大家在尝试以及玩转Docker的同时,肯定离不开一个概念,那就是“容器”或者“Docker Container”.那 ...