JDK7中ExecutorService源码概述
来源:互联网 发布:用js怎么写九九乘法表 编辑:程序博客网 时间:2024/06/07 15:20
ExecutorService是java.util.concurrent包下的接口(public interface ExecutorService extends Executor),所有已知子接口:ScheduledExecutorService,所有已知实现类:AbstractExecutorService,ScheduledThreadPoolExecutor,ThreadPoolExecutor。
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的Executors.newFixedThreadPool(int)工厂方法:
class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize)throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void run() { // run the service
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
}
下列方法分两个阶段关闭ExecutorService。第一阶段调用shutdown拒绝传入任务,然后调用shutdownNow(如有必要)取消所有遗留的任务:
void shutdownAndAwaitTermination(ExecutorService pool){
pool.shutdown(); // Disable new tasks from being submitted
try{
// Wait a while for existing tasks to terminate
if(!pool.awaitTermination(60, TimeUnit.SECONDS)){
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
}catch(InterruptedException ie){
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
内存一致性效果:线程中向ExecutorService提交Runnable或Callable任务之前的操作happen-before由该任务所提取的所有操作,后者依次happen-before通过Future.get()获取的结果。
实现可参考:https://github.com/chunericli/wise-utils
Executor提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future的方法。可以关闭ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭ExecutorService。shutdown()方法在终止前允许执行以前提交的任务,而shutdownNow()方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的ExecutorService以允许回收其资源。通过创建并返回一个可用于取消执行和/或等待完成的Future,方法submit扩展了基本方法Executor.execute(java.lang.Runnable)。方法invokeAny和invokeAll是批量执行的最常用形式,它们执行任务collection,然后等待至少一个,或全部任务完成(可使用ExecutorCompletionService类来编写这些方法的自定义变体)。
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的Executors.newFixedThreadPool(int)工厂方法:
class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize)throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void run() { // run the service
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
}
下列方法分两个阶段关闭ExecutorService。第一阶段调用shutdown拒绝传入任务,然后调用shutdownNow(如有必要)取消所有遗留的任务:
void shutdownAndAwaitTermination(ExecutorService pool){
pool.shutdown(); // Disable new tasks from being submitted
try{
// Wait a while for existing tasks to terminate
if(!pool.awaitTermination(60, TimeUnit.SECONDS)){
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
}catch(InterruptedException ie){
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
内存一致性效果:线程中向ExecutorService提交Runnable或Callable任务之前的操作happen-before由该任务所提取的所有操作,后者依次happen-before通过Future.get()获取的结果。
实现可参考:https://github.com/chunericli/wise-utils
阅读全文
0 0
- JDK7中ExecutorService源码概述
- JDK7中Condition源码概述
- JDK7中Lock源码概述
- JDK7中ReadWriteLock源码概述
- JDK7中Executor源码概述
- JDK7中Executors源码概述
- JDK7中ThreadPoolExecutor源码概述
- JDK7中Runnable和Callable源码概述
- JDK7中BlockingQueue和Queue源码概述
- JDK7中ThreadFactory和RejectedExecutionHandler源码概述
- JDK7中Future,FutureTask和RunnableFuture源码概述
- JDK中ExecutorService源码解读
- JDK7中LockSupport源码解析
- JDK7中AtomicInteger源码解析
- JDK7中ArrayBlockingQueue源码解析
- JDK7中LinkedBlockingQueue源码解析
- JDK7中SynchronousQueue源码解析
- JDK7中StringBuffer/StringBuilder源码解析
- Java中文转GBK码
- <背包DP>codevs 1684 垃圾陷阱
- Yaml简易学习
- Animation Silder实现动画播时滑动条随之滑动
- android面试-内存泄漏(美图、久邦面涉及到)
- JDK7中ExecutorService源码概述
- 揭秘云栖大会VR直播云服务解决方案的技术亮点和核心能力
- UVa11538
- 习题4.2
- React-Native学习笔记(一)
- java 中取整操作提供了四种方法
- PullToRefreshListView 获取网络数据实现上下拉刷新加载数据
- 揭秘云栖大会VR直播云服务解决方案的技术亮点和核心能力
- 第四章 字典