Executor
来源:互联网 发布:富爸爸现金流游戏 mac 编辑:程序博客网 时间:2024/05/16 10:42
简答的一个例子:
服务端:
package com.jerry.concurrency.executor;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.RejectedExecutionException;public class MyServer {private static final ExecutorService exec = Executors.newFixedThreadPool(10);public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(8080);while(!exec.isShutdown()){final Socket conn = server.accept();Runnable command = new Runnable(){@Overridepublic void run() {Long i = Thread.currentThread().getId();System.out.println(i);try {stop();} catch (RejectedExecutionException e) {System.out.println("拒绝提交任务!");} }};exec.execute(command);}}public static void stop(){exec.shutdown();}}
客户端:
package com.jerry.concurrency.executor;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import java.util.concurrent.ExecutorService;public class Cilent {public static void main(String[] args) throws UnknownHostException, IOException {for(int i=0;i<=100;i++){Socket socket=new Socket("127.0.0.1",8080);}}}
运行结果可见共创建了10个线程,即使客户端和服务端进行了100次连接。
下面详解一下Executors的静态方法:
newFixedThreadPool 创建一个定长的线程池,每提交一个任务就会创建一个线程,直到最大长度,这时线程池会保持长度不能变化,如果有一个线程由于异常结束,线程池会补充一个新的。
newCachedThreadPool 创建一个可缓存的线程池,可以灵活回收空闲的线程,也可以灵活的添加,并不对池长度做任何限制。
newSingleThreadExecutor 创建一个单线程化的executor,确保只创建一个唯一的线程来执行任务,如果这个线程意外退出了,会有另外一个来取代它。保证任务队列FIFO、LIFO执行。
newScheduledThreadPool 创建一个定长的线程池,支持定时、周期性的任务执行,类似Timer。
ExecutorService扩展了Executor并添加了一些生命周期管理的方法。一个Executor的生命周期有三种状态:运行 ,关闭 ,终止 。Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,处于关闭状态,isShutdown()方法返回true。这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor处于终止状态,isTerminated()返回true。shutdownNow()提供强行关闭的过程:取消所有运行中的任务和排在队列中尚未开始的任务。
如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException。
上面的例子改为一个简单的可以控制生命周期的例子:
package com.jerry.concurrency.executor;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.RejectedExecutionException;public class MyServer {private static final ExecutorService exec = Executors.newFixedThreadPool(10);public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(8080);while(!exec.isShutdown()){final Socket conn = server.accept();Runnable command = new Runnable(){@Overridepublic void run() {Long i = Thread.currentThread().getId();System.out.println(i);try {stop();} catch (RejectedExecutionException e) {System.out.println("拒绝提交任务!");} }};exec.execute(command);} }public static void stop(){exec.shutdown();}}
客户端代码不变。
- Executor
- Executor
- Executor
- Executor
- Executor
- Executor
- Executor
- Executor
- Executor
- Executor
- 【Java】【Executor】Executor 简介
- Executor框架
- Executor框架
- Executor 生命周期
- Executor框架
- Executor & ExecutorService
- Executor框架
- Executor框架
- HttpURLConnection用法详解
- C# 将DataGridView控件内容导出到Excel报表
- Oracle 游标使用全解
- HDOJ 2647 Reward (拓扑排序)
- 表空间数据文件迁移(二)
- Executor
- Socket编程中的select多路复用
- ASP.NET 安全策略学习与 .NET 测试环境搭建
- Using the Flex Compilers Flex编译器的使用 第三部分
- Option
- wordpress代码调用大全
- 侃一侃vc的std::string
- HDU 2955
- C#之HelloWorld,防止黑屏一闪而过