FixedThreadPool
是一个典型的线程池,它拥有固定数量的线程来执行任务。下面是如何在实践中使用FixedThreadPool
的基本步骤:
步骤 1: 创建FixedThreadPool
你需要使用Executors
类的newFixedThreadPool
方法来创建一个固定大小的线程池。参数nThreads
指定了线程池中的线程数量。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
int nThreads = 5; // 你希望的线程数量
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
步骤 2: 创建Runnable任务
创建要执行的任务。任务是实现了Runnable
接口的类的实例。
class Task implements Runnable {
private final int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task ID: " + taskId + ", executed by: " + Thread.currentThread().getName());
}
}
步骤 3: 提交任务到FixedThreadPool
使用ExecutorService
的execute
方法来提交任务给线程池执行。
for (int i = 0; i < 10; i++) {
executorService.execute(new Task(i)); // 提交任务
}
步骤 4: 关闭线程池
一旦任务提交完成,并且你不打算再提交新的任务时,应该关闭线程池。使用shutdown()
方法来启动线程池的平缓关闭过程,它不会中断正在执行的任务。
executorService.shutdown();
如果你希望立即关闭线程池,并尝试停止所有正在执行的任务,则可以使用shutdownNow()
方法。
List<Runnable> notStartedTasks = executorService.shutdownNow();
完整示例
以下是一个使用FixedThreadPool
的完整示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FixedThreadPoolExample {
public static void main(String[] args) {
// 创建固定大小的线程池
int nThreads = 5;
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
// 创建并提交任务
for (int i = 0; i < 10; i++) {
executorService.execute(new Task(i));
}
// 所有任务提交后关闭线程池
executorService.shutdown();
// 等待所有任务完成
while (!executorService.isTerminated()) {
// 可以在此处等待或做其他的事情
}
System.out.println("All tasks finished.");
}
}
class Task implements Runnable {
private final int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task ID: " + taskId + ", executed by: " + Thread.currentThread().getName());
// 模拟任务执行时间
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
在这个示例中,我们创建了一个包含5个线程的FixedThreadPool
,然后提交了10个任务。每个任务都打印其ID和执行它的线程。最后,我们调用shutdown()
方法来关闭线程池,并等待所有任务完成。
请注意,一旦线程池通过shutdown()
方法关闭,就不能再提交新任务了,否则会抛出RejectedExecutionException
异常。如果你需要提交更多任务,那么不应该关闭线程池。