ExecutorService
ExecutorService
ExecutorService介绍
ExecutorService是Java中用于管理线程池的核心接口之一,它继承自Executor接口,提供了一组用于提交任务、执行任务和关闭线程池的方法。
ExecutorService接口提供了多种类型的线程池实现,例如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等等,它们各自具有不同的特点和适用场景。
在使用ExecutorService创建线程池时,我们可以通过调整参数来控制线程池的大小、任务队列、拒绝策略等等,以满足不同的需求和场景。
下面是一些常用的ExecutorService方法:
- execute(Runnable task):提交一个Runnable任务到线程池中执行。
- submit(Callable task):提交一个Callable任务到线程池中执行,并返回一个Future对象,可以用来获取任务的执行结果。
- shutdown():关闭线程池,不再接受新的任务提交,但会等待已经提交的任务执行完成后再关闭线程池。
- shutdownNow():立即关闭线程池,尝试终止正在执行的任务,并返回等待执行的任务列表。
- isShutdown():判断线程池是否已经关闭。
- isTerminated():判断线程池是否已经终止。
- awaitTermination(long timeout, TimeUnit unit):等待线程池终止,阻塞调用线程直到线程池终止或者超时。
ExecutorService示例
下面是一个使用ExecutorService创建线程池的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
Runnable task = new MyTask(i);
executor.execute(task);
}
executor.shutdown();
}
private static class MyTask implements Runnable {
private int taskId;
public MyTask(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
}
}
}
在上面的示例代码中,我们使用Executors工厂类创建了一个FixedThreadPool线程池,线程池大小为10。然后,我们提交了100个MyTask任务到线程池中执行,每个任务输出自己的编号和执行的线程名。最后,我们调用shutdown方法关闭线程池。
需要注意的是,在使用ExecutorService创建线程池时,需要根据具体的需求和场景来选择合适的线程池类型和参数配置,以确保线程池的性能和稳定性。同时,我们还需要注意线程池中任务的执行顺序和线程安全问题,以避免出现意外的错误。