Java线程面试题:什么是线程池?为什么要使用线程池?
线程池是一组重复使用的线程,用于处理大量并发任务。通过使用线程池,可以减少线程的创建和销毁次数,提高资源的利用率,并且能够更好地管理和控制线程的数量和执行状态。下面我们使用一个例子来说明 Java 中线程池的使用:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
public static void main(String[] args) {
// 创建一个可重用、固定线程数的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);
// 向线程池中添加 10 个任务
for (int i = 0; i < 10; i++) {
Runnable task = new Task(i);
threadPool.execute(task);
}
// 禁止提交新任务,并试图终止所有正在执行的任务
threadPool.shutdown();
// 判断是否所有任务都已经执行完成
while (!threadPool.isTerminated()) {
Thread.yield();
}
System.out.println("All tasks are completed.");
}
}
class Task implements Runnable {
private int number;
public Task(int number) {
this.number = number;
}
@Override
public void run() {
System.out.println("Task " + number + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + number + " is completed on thread " + Thread.currentThread().getName());
}
}
在上面的例子中,我们首先创建了一个固定大小为 3 的线程池 threadPool
,然后向线程池中添加了 10 个任务,这些任务都实现了 Runnable
接口。在每个任务执行时,输出当前任务的编号和所在线程的名称,并休眠 1s 后再输出完成信息。最后调用shutdown方法来禁止提交新任务,并试图终止所有正在执行的任务,等待所有任务执行完毕后输出 “All tasks are completed.”。
总结:线程池通过预先创建一组线程来处理大量并发的任务,可以提高资源利用率、管理和控制线程数量和执行状态,并且能够更好地应对高并发环境下的任务处理需求。