ExecutorService
是 Java 提供的一个用于管理和控制线程执行的接口,它提供了一种将任务提交与任务执行机制解耦的方法。通过 ExecutorService
,可以方便地提交任务并管理线程池中的线程。
当提到“在一定队列大小后阻塞提交的 ExecutorService
”,通常指的是使用有界队列(如 ArrayBlockingQueue
)的线程池。在这种情况下,当任务队列达到其最大容量时,新提交的任务将被阻塞,直到队列中有空闲位置。
ArrayBlockingQueue
:基于数组的有界阻塞队列,适用于需要严格控制队列大小的场景。LinkedBlockingQueue
:基于链表的可选有界阻塞队列,适用于任务量较大且队列大小可动态调整的场景。应用场景包括:
问题:当任务队列满时,新提交的任务会被阻塞,这可能导致应用程序的响应时间变长或出现超时。
原因:任务队列已满,新任务无法立即执行,需要等待队列中有空闲位置。
解决方法:
AbortPolicy
、CallerRunsPolicy
等)来处理新提交的任务。示例代码:
import java.util.concurrent.*;
public class ExecutorServiceExample {
public static void main(String[] args) {
int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 5000;
TimeUnit unit = TimeUnit.MILLISECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
ThreadPoolExecutor executorService = new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
keepAliveTime,
unit,
workQueue
);
// 提交任务
for (int i = 0; i < 150; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Task " + taskNumber + " is completed");
});
}
executorService.shutdown();
}
}
参考链接:
通过以上配置和代码示例,可以有效地管理和控制线程池中的任务提交和执行,避免因队列满而导致的问题。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云