简答的一个例子:
服务端:
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(){
@Override
public 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(){
@Override
public 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();
}
}
客户端代码不变。
分享到:
相关推荐
XXL-JOB是一个分布式任务调度平台,而"xxl-job-executor-go-master"则表示这个项目是XXL-JOB的Go语言实现版本的源码仓库。这个仓库是针对XXL-JOB执行器的一个Go语言实现,它使得开发者可以利用Go语言来编写调度任务...
hadoop自带的Container-executor在配置yarn-kerberos时存在问题,以及在配置cgroup时需要把container-executor.cfg的上级目录拥有者均改为root,带来不便。 所以需要重新编译Container-executor,这边提供重新编译好...
### Spark:Executor分配详解 #### 一、Spark的资源分配机制概述 在深入探讨Executor的分配之前,我们先从整体上理解一下Spark集群的工作原理。Spark集群架构主要包括以下几个核心组件:SparkMaster(简称Master)...
Executor框架是Java并发编程的核心组件,它在Java 5中被引入,极大地简化了多线程编程。这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor...
Executor 2.1 Pre-Release 11是一款专为非苹果电脑设计的Macintosh OS模拟程序,它允许用户在非Macintosh系统上运行基于Classic Mac OS的应用程序。这个软件版本是一个预发布版,意味着它是公开发布前的最后一个测试...
Executor是一款高效且便捷的应用启动工具,它允许用户通过简单的配置,快速地打开电脑中的任何应用程序,从而极大地提升了桌面管理的效率。在日常工作中,我们常常会安装很多软件,导致桌面图标繁多,查找起来十分...
而`Executor`则是`SqlSession`内部的一个执行器接口,是MyBatis实现数据库操作的核心部分。本文将深入探讨`SqlSession`和`Executor`的实现机制及其在MyBatis中的作用。 `SqlSession`是MyBatis的对外接口,它提供了...
Executor是一款高效的快捷启动软件,它的主要功能是帮助用户快速启动应用程序、文件或系统命令,极大地提高了用户的工作效率。在IT领域,这样的工具被广泛使用,尤其是对于经常需要频繁切换和执行各种任务的用户来说...
hadoop自带的Container-executor在配置yarn-kerberos时存在问题,这边给出编译后的Container-executor,默认加载配置文件路径/etc/container-executor.cfg,大家不用再重新编译了
FANUC C Language Executor
**Flask Executor** 是一个基于Python的Web框架——**Flask** 的扩展,它允许你在Flask应用中异步执行任务。这个库的核心功能是引入了线程池或进程池来处理那些耗时较长的任务,避免阻塞主线程,从而提高Web应用的...
【Executor、Executors和ExecutorService详解】 在Java并发编程中,`Executor`、`Executors`和`ExecutorService`是核心组件,它们帮助开发者高效管理线程资源,提高程序的并发性能。理解这三个概念的区别和用途是...
安装时,你需要解压这个文件,根据提供的文档配置服务器环境,如设置JVM参数、配置executor.properties文件,并启动Executor服务,使其能够接收和处理任务请求。 **Azkaban Web Server** 则是用户界面和任务管理的...
3. Multiple-Executor Mode:在大型或分布式环境中使用,Web Server和多个Executor Server分布在不同的机器上,同样使用MySQL数据库,提供更高的可扩展性和容错性。 部署Azkaban的Solo Server模式通常涉及以下几个...
标题提到的"azkaban 3.4 编译后安装文件,分布式多executor"指的是Azkaban的3.4版本,该版本支持构建并部署到一个具有多个Executor节点的集群中,以提高任务处理能力。 安装文档是指导用户如何正确安装和配置...
《ha-executor_v09842一键秒开软件:高效快捷的启动工具解析》 在信息化时代,软件已经成为我们日常工作中不可或缺的一部分。为了提高工作效率,快速启动常用软件显得尤为重要。ha-executor_v09842一键秒开软件正是...
"Executor汉化版"作为其中的佼佼者,不仅以其炫酷的界面吸引用户,还以其实用的功能满足不同用户的需求。本文将对"Executor汉化版"这一快速启动工具的功能、特点以及使用方式进行详细解读。 首先,"Executor汉化版...
该文档详细记录了Executor框架结构、使用示意图、ThreadPoolExecutor使用示例、线程池原理分析、几种常见线程池(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)的详解以及线程池大小确定等内容
`Executor`线程池是一种优秀的解决方案,它可以帮助开发者更好地控制并发执行的任务,避免过度创建线程导致资源浪费和系统稳定性下降。本文将深入探讨`Android Executor`线程池的工作原理、优势以及如何在实际开发中...