螺竹编程
发布于 2024-05-17 / 2 阅读
0

Java并发编程/线程池: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创建线程池时,需要根据具体的需求和场景来选择合适的线程池类型和参数配置,以确保线程池的性能和稳定性。同时,我们还需要注意线程池中任务的执行顺序和线程安全问题,以避免出现意外的错误。