常见的线程池有以下几种:
固定大小线程池
固定大小线程池使用 Executors.newFixedThreadPool() 方法创建,该方法需要传入一个整型参数,指定了线程池的大小。固定大小线程池的大小不会发生变化,如果有新的任务加入,而线程池中的线程都在忙碌,则新的任务会被暂存在一个任务队列中,等到有空闲的线程时再执行。
以下是一个固定大小线程池的示例代码:
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int taskId = i;
executorService.submit(() -> {
System.out.println("Task " + taskId + " is running.");
});
}
executorService.shutdown();
上述代码创建了一个大小为3的线程池,并提交了10个任务。由于线程池大小为3,所以每次只有3个任务会同时执行,剩余的任务会被暂存,并等待前面的任务执行完毕后再执行。当所有任务都执行完毕后,需要调用 shutdown()
方法关闭线程池。
缓存线程池
缓存线程池使用 Executors.newCachedThreadPool() 方法创建,该方法不需要传入任何参数。缓存线程池的大小会根据任务数量自动调整,如果有新的任务加入,而线程池中的线程都在忙碌,则会创建新的线程来执行任务,如果有线程空闲超过了60秒,则会被停止并从线程池中移除。
以下是一个缓存线程池的示例代码:
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int taskId = i;
executorService.submit(() -> {
System.out.println("Task " + taskId + " is running.");
});
}
executorService.shutdown();
上述代码创建了一个缓存线程池,并提交了10个任务。由于线程池大小会根据任务数量自动调整,所以不需要手动指定线程池的大小。当所有任务都执行完毕后,需要调用 shutdown()
方法关闭线程池。
这两个示例展示了如何使用固定大小线程池和缓存线程池来执行任务。在使用时,需要根据任务的特性和需求选择合适的线程池类型。