在java类库中,任务执行的主要抽象不是Thread,而是Executor,将任务的提交过程和执行过程解耦
public interface Executor {
void execute(Runnable command);
}
public class RunMain implements Executor{
@Override
public void execute(Runnable command) {
new Thread(command).start();
}
}
为了解决执行服务的生命周期问题,Executor扩展了ExecutorService接口
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
// ....其他任务提交的便利方法
}
- ExecutorService的生命周期有3种状态,运行、关闭、已终止。
- shutdown执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成
- shutdownNow方法将执行粗暴的关闭方式:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务
- 可以调用awaitTermination来等待ExecutorService到达终止状态,或者通过调用isTerminated来轮询ExecutorService是否已经终止
线程池:
newFixedThreadPool :创建一个固定长度的线程池,每当提交一任务就创建一个线程,知道达到线程池的最大数量(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程)
newCachedThreadPool:创建一个可缓存的线程池,如果线程池规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制
newSingleThreadExecutor:单线程的Executor,如果这个线程结束会创建一个新的线程来替代,能确保依照在队列中的顺序来穿行执行
newScheduledThreadPool:创一个固定长度的线程池,而且以延迟或定时的方式来执行任务,用于替换Timer
import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
public class TestScheduledThread {
public static void main(String[] args) {
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
final Runnable beeper = new Runnable() {
int count = 0;
public void run() {
System.out.println(new Date() + " beep " + (++count));
}
};
// 1秒钟后运行,并每隔2秒运行一次
final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate(beeper, 1, 2, SECONDS);
// 2秒钟后运行,并每次在上次任务运行完后等待5秒后重新运行
final ScheduledFuture beeperHandle2 = scheduler.scheduleWithFixedDelay(beeper, 2, 5, SECONDS);
// 30秒后结束关闭任务,并且关闭Scheduler
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
beeperHandle2.cancel(true);
scheduler.shutdown();
}
}, 30, SECONDS);
}
}
Runnable 和 Callable 描述的都是抽象的计算任务,后者有返回值,并可能抛出一个异常
Executor执行的任务有4个生命周期阶段:创建、提交、开始和完成
ExecutorService中所有的submit方法豆浆返回一个Future,
Callable 与 Future接口
public interface Callable<V> {
V call() throws Exception;
}
public interface Future<V> {
/**
* 试图取消对此任务的执行,
* 如果任务已经启动,则mayInterruptIfRunning参数决定是否执行此任务的线程中断
*
* 此方法返回后,后续调用isDone将始终返回true。
* 后续调用isCancelled将始终返回true
*
*/
boolean cancel(boolean mayInterruptIfRunning);
/**
*如果这个任务被取消之前,正常完成。返回true
*/
boolean isCancelled();
boolean isDone();
/**
* 等待计算完成,然后获取其结果
* @throws CancellationException
* if the computation was cancelled
* @throws ExecutionException
* if the computation threw an exception
* @throws InterruptedException
* if the current thread was interrupted while waiting
*/
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
CompletionService用于封装
public class RunMain implements Callable<String> {
private int id;
public RunMain(int i) {
this.id = i;
}
public static void main(String[] args) throws Exception {
ExecutorService service = Executors.newCachedThreadPool();
CompletionService<String> completion = new ExecutorCompletionService<String>(service);
for (int i = 0; i < 10; i++) {
completion.submit(new RunMain(i));
}
for (int i = 0; i < 10; i++) {
System.out.println(completion.take().get());
}
service.shutdown();
}
public String call() throws Exception {
Integer time = (int) (Math.random() * 1000);
try {
System.out.println(this.id + " start");
Thread.sleep(time);
System.out.println(this.id + " end");
} catch (Exception e) {
e.printStackTrace();
}
return this.id + ":" + time;
}
}
分享到:
相关推荐
线程池 Executors
java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...
Java中Executors类中几种创建各类型线程池方法及简单实例
面试过程中他问了线程池,今天详细讲一讲Java 线程池。 线程池 线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。 start()创建一定数量的线程池,进行...
我自己写了个小例子,用到两个关键字,datagrameSocket表示客户程序和服务程序自寻址套接字,datagramePacket对象描绘了自寻址包的地址信息,以及线程池Executors的newFixedThreadPool()方法
java 线程池管理类:Executors_.docx
java8 ...Java线程池Executors ForkJoin框架 原子操作类 JVM 虚拟机结构 class 文件格式 ClassFile 常量池 类的加载链接与初始化 对象的生命周期 垃圾收集器和内存分配策略 虚拟机性能监控工具 编程规范
NULL 博文链接:https://bijian1013.iteye.com/blog/2284676
Executors: 是java.util.concurrent包下的一个类,提供了若干个静态方法,用于生成不同类型的线程池。Executors一共可以创建下面这四类线程池: 1.newFixedThreadPool创建一个可缓存线程池,如果线程池长度超过...
线程是系统中可执行调度的...线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,规避资源耗尽的风险。集合的详细描述,以及集合中的异同点,HashMap不同jdk版本区别,ConcurrentHashMap介绍。
[2]中介绍了java.util.concurrent.Executors类的API。 [3]中介绍了Java中线程池的类体系结构。 [4]中有ThreadPoolExecutor的实例应用。 [5]中有线程池的实例讲解,实现了一个基于线程池的端口监听服务器。★ [6]...
而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,...
ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务
【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors返回的线程池对象的弊端如下: 1) ...
Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等示例,列出一些源码包中包括的内容: volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小...
//Runtime的availableProcessors()方法返回当前系统的CPU的数目 //系统的CPU越多,线程池中工作线程的数目也越多 executorService= Executors.newFixedThreadPool( Runtime.getRuntime()....
ThreadPoolExecutor的使用和Android常见的4种线程池使用介绍
线程池设计思路,java提供自带的线程池类ThreadPoolExecutor详解,Executors调用静态方法创建线程池
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池...
该组件中,Executor 和 ExecutorService 接口 定义了线程池最核心的几个方法,提交任务 submit ()、关闭线程池 shutdown()。...另外还有一个常见的工具类 Executors,里面为开发者封装了一些可以直接拿来用的线程池。