在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;
}
}
分享到:
相关推荐
Java中的线程池Executors java中的线程池Executors是Java并发编程中的一种重要概念,它提供了一种高效、灵活的线程管理机制。使用线程池可以降低资源消耗,提高响应速度,提高线程的可管理性。 线程池的优点 1. ...
java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...
Java中Executors类中几种创建各类型线程池方法及简单实例
面试过程中他问了线程池,今天详细讲一讲Java 线程池。 线程池 线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。 start()创建一定数量的线程池,进行...
我自己写了个小例子,用到两个关键字,datagrameSocket表示客户程序和服务程序自寻址套接字,datagramePacket对象描绘了自寻址包的地址信息,以及线程池Executors的newFixedThreadPool()方法
### Java线程池管理类:Executors_ #### 概述 `java.util.concurrent.Executors` 是Java并发编程中一个非常重要的工具类,主要用于创建不同类型的线程池对象。通过使用`Executors`类,开发者可以方便地管理和控制...
因此,不建议使用 Executors 去创建线程池,而是通过 ThreadPoolExecutor 的方式来创建线程池。 例如,可以使用 ThreadPoolExecutor 来创建一个具有特定线程池大小和队列大小的线程池。 ThreadPoolExecutor pool =...
java8 ...Java线程池Executors ForkJoin框架 原子操作类 JVM 虚拟机结构 class 文件格式 ClassFile 常量池 类的加载链接与初始化 对象的生命周期 垃圾收集器和内存分配策略 虚拟机性能监控工具 编程规范
NULL 博文链接:https://bijian1013.iteye.com/blog/2284676
下面是使用 Executors 工厂类创建线程池的示例代码: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FixedThreadPool { public static void main...
使用Executors构建线程池时需要注意,如使用默认设置可能导致线程池积压过多任务或创建过多线程,从而引发内存溢出。因此,推荐自定义配置线程池,如使用有界队列ArrayBlockingQueue,并合理设定核心线程数、最大...
在Java中,使用`ExecutorService`和`ThreadPoolExecutor`来创建线程池,而不是直接使用`Executors`,因为`Executors`创建的线程池可能会导致资源耗尽的问题。 集合是Java中存储数据的主要工具,包括List、Set和Map...
Java的`java.util.concurrent`包提供了四种主要的线程池实现:`Executors.newFixedThreadPool()`, `Executors.newSingleThreadExecutor()`, `Executors.newCachedThreadPool()`以及`Executors.newWorkStealingPool()...
Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...
Executors提供了三个方法来创建线程池: 1. newFixedThreadPool(int nThreads):创建固定大小的线程池,使用LinkedBlockingQueue队列存放任务,maximumPoolSize参数无效。 2. newSingleThreadExecutor():创建单...
`Executors` 类是一个静态工厂类,用于创建不同类型的线程池,如固定大小的线程池、单线程线程池、缓存线程池等。 4. **创建线程池**:使用`Executors`类的静态方法创建线程池,例如 `newFixedThreadPool(int ...
例如,在代码示例中,使用Executors.newSingleThreadExecutor()创建了一个单线程线程池,并且通过pool.execute(t1);等方法提交了多个任务到线程池中执行。最后,通过调用pool.shutdown()方法来关闭线程池,释放相关...
本文将深入探讨四种常见的Java线程池实例:`ThreadPoolExecutor`、`Executors`提供的固定线程池、单线程池和定时线程池。 1. **ThreadPoolExecutor**: 这是最基础也是最灵活的线程池实现,可以通过`new ...
例如,创建一个固定大小的线程池可以使用`Executors.newFixedThreadPool(int nThreads)`,而创建一个按需增长的线程池可以使用`Executors.newCachedThreadPool()`。 线程池的配置需要根据实际应用的需求进行,包括...
1. 使用Executors工具类:Executors工具类提供了多种方式创建线程池,例如FixedThreadPool、SingleThreadExecutor、CachedThreadPool等。 2. 使用ThreadPoolExecutor构造方法:ThreadPoolExecutor构造方法可以根据...