在Java中,线程池是一种常见的多线程编程技术,它可以有效地管理线程的创建和销毁,避免了频繁创建和销毁线程所带来的额外开销。本文将深入介绍Java中的线程池,涵盖ThreadPoolExecutor和ExecutorService两种线程池的使用方法、参数说明以及示例代码。
ThreadPoolExecutor是Java中内置的线程池实现类,它提供了丰富的配置选项,可以自定义线程池的核心线程数、最大线程数、阻塞队列、拒绝策略等参数。
下面是创建ThreadPoolExecutor的示例代码:
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
其中,corePoolSize是线程池的核心线程数,maximumPoolSize是线程池的最大线程数,keepAliveTime是非核心线程的空闲时间,TimeUnit是时间单位,LinkedBlockingQueue是阻塞队列的一种实现方式。
ThreadPoolExecutor的参数说明如下:
下面是一个简单的线程池使用示例,它创建了一个线程池,向线程池中提交了10个任务,每个任务的执行时间为1秒。
public static void main(String[] args) throws InterruptedException {
int corePoolSize = 2;
int maximumPoolSize = 4;
long keepAliveTime = 10;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
for (int i = 0; i < 10; i++) {
executor.execute(new Task(i));
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
}
static class Task implements Runnable {
private int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
public void run() {
try {
System.out.println("Task-" + taskId + " start");
TimeUnit.SECONDS.sleep(1);
System.out.println("Task-" + taskId + " end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}上述示例中,核心线程数为2,最大线程数为4,阻塞队列为LinkedBlockingQueue,任务执行时间为1秒。通过execute方法向线程池中提交了10个任务,由于线程池中只有2个核心线程,因此前两个任务会立即执行,后续的任务会被加入到阻塞队列中等待执行。当阻塞队列满时,线程池会创建新的非核心线程执行任务,直到达到最大线程数为止。当线程空闲时间超过keepAliveTime时,非核心线程会被销毁。最后调用shutdown方法关闭线程池,并等待所有任务执行完成。
ExecutorService是Java中提供的线程池框架,它提供了一些常用的线程池实现,如FixedThreadPool、CachedThreadPool、SingleThreadExecutor等,并且支持提交Callable和Runnable任务。
下面是创建FixedThreadPool的示例代码:
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
其中,nThreads是线程池的线程数。
ExecutorService提供了一些常用的方法,如submit、invokeAll、invokeAny、shutdown等。
下面是一个使用FixedThreadPool的示例代码,它创建了一个FixedThreadPool,并向线程池中提交了10个任务,每个任务的执行时间为1秒。
public static void main(String[] args) throws InterruptedException, ExecutionException {
int nThreads = 2;
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
for (int i = 0; i < 10; i++) {
futures.add(executor.submit(new Task(i)));
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
for (Future<Integer> future : futures) {
System.out.println(future.get());
}
}
static class Task implements Callable<Integer> {
private int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
public Integer call() throws Exception {
System.out.println("Task-" + taskId + " start");
TimeUnit.SECONDS.sleep(1);
System.out.println("Task-" + taskId + " end");
return taskId;
}
}上述示例中,FixedThreadPool的线程数为2,任务执行时间为1秒。通过submit方法向线程池中提交了10个Callable任务,并将返回的Future对象存储到列表中。调用shutdown方法关闭线程池,并等待所有任务执行完成。最后遍历Future列表,获取每个任务的执行结果。
本文深入介绍了Java中的线程池,涵盖了ThreadPoolExecutor和ExecutorService两种线程池的使用方法、参数说明以及示例代码。线程池是Java中常见的多线程编程技术,可以有效地管理线程的创建和销毁,避免了频繁创建和销毁线程所带来的额外开销。希望本文能够帮助读者更好地理解和应用线程池。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com
