java线程池有哪些?
作者:卡卷网发布时间:2025-01-19 19:12浏览数量:141次评论数量:0次
这题我会,java线程池有以下几种:
1. CachedThreadPool
- 特点:这种线程池会创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求,那么会回收空闲的线程(60秒不执行任务)。当需求增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不对线程池大小做限制,完全依赖于JVM能够创建的最大线程大小。
- 适用场景:适用于执行很多短期异步任务的程序。
- 示例:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
cachedThreadPool.execute(new Runnable() {
public void run() {
System.out.println(index);
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
2. FixedThreadPool
- 特点:创建一个最大线程数固定的线程池。在任何时候,最多有N个线程会被工作,如果一个线程因为执行异常而结束,那么线程池会补充一个新线程。
- 适用场景:适用于负载比较重、任务数比较多且线程执行时间较长的场景。
- 示例:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
3. SingleThreadExecutor
- 特点:只会创建一个线程,所有的任务都会按照任务的提交顺序来执行。如果这个线程异常结束,会新建一个线程继续工作。
- 适用场景:适用于需要保证一系列相关任务顺序执行的场景。
- 示例:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
4. ScheduledThreadPool
- 特点:创建一个定时任务线程池,可以调度命令在给定的延迟后运行,或定期执行。
- 适用场景:适用于需要执行定时任务或周期性任务的场景。
- 示例:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 10; i++) {
final int index = i;
scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println(index);
}
}, index * 1000, TimeUnit.MILLISECONDS);
}
5. WorkStealingPool
- 特点:创建一个拥有多个工作线程的线程池,这些工作线程会尝试“窃取”任务来执行。这种线程池可以提高CPU的利用率,适用于多核处理器。
- 适用场景:适用于任务数量多且任务执行时间较短的场景。
- 示例:
ExecutorService workStealingPool = Executors.newWorkStealingPool();
for (int i = 0; i < 10; i++) {
final int index = i;
workStealingPool.execute(new Runnable() {
public void run() {
System.out.println(index);
}
});
}
6. ForkJoinPool
- 特点:
ForkJoinPool
是java.util.concurrent
包中的一个线程池,用于执行ForkJoinTask
任务。它使用了工作窃取算法,可以高效地处理大量小任务。 - 适用场景:适用于需要递归分解任务的场景,如并行计算。
- 示例:
ForkJoinPool forkJoinPool = new ForkJoinPool();
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = forkJoinPool.invoke(new SumTask(nums, 0, nums.length));
System.out.println(result); // 输出 55
7. 自定义线程池
- 特点:可以自定义线程池的各种参数,如核心线程数、最大线程数、线程存活时间、任务队列等。
- 适用场景:适用于需要精细控制线程池行为的场景。
- 示例:
int corePoolSize = 5;
int maximumPoolSize = 10;
long keepAliveTime = 1;
TimeUnit unit = TimeUnit.MINUTES;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler
);
for (int i = 0; i < 10; i++) {
final int index = i;
customThreadPool.execute(new Runnable() {
public void run() {
System.out.println(index);
}
});
}
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:不会写复杂的SQL,该怎么学习?
- 下一篇:你见过最脑残的设计是什么?
相关推荐

你 发表评论:
欢迎