
使用线程池可以减少线程的创建和销毁次数,提高程序的性能和效率。它可以管理线程的数量、执行任务队列中的任务,并可配置各种参数以适应不同的应用场景。
Java提供了java.util.concurrent包来支持线程池的实现。
Java提供了Executors类来创建不同类型的线程池,比如FixedThreadPool、CachedThreadPool等。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池,大小为5
ExecutorService executor = Executors.newFixedThreadPool(5);
// 循环提交任务到线程池
for (int i = 0; i < 10; i++) {
// 创建一个新的WorkerThread任务,并将其提交到线程池中执行
Runnable worker = new WorkerThread("Task " + i);
executor.execute(worker);
}
// 关闭线程池,不再接受新的任务
executor.shutdown();
// 等待所有线程执行完毕,即线程池中所有任务执行完毕
while (!executor.isTerminated()) {
}
// 所有任务执行完毕后输出提示信息
System.out.println("所有线程执行完毕");
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
// 构造函数,用于初始化任务描述信息
public WorkerThread(String s) {
this.task = s;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 输出当前线程名字、任务开始信息
System.out.println(Thread.currentThread().getName() + " 开始执行任务:" + task);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println(Thread.currentThread().getName() + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}pool-1-thread-2 开始执行任务:Task 1
pool-1-thread-5 开始执行任务:Task 4
pool-1-thread-4 开始执行任务:Task 3
pool-1-thread-3 开始执行任务:Task 2
pool-1-thread-1 开始执行任务:Task 0
pool-1-thread-2 任务执行完毕:Task 1
pool-1-thread-1 任务执行完毕:Task 0
pool-1-thread-1 开始执行任务:Task 6
pool-1-thread-5 任务执行完毕:Task 4
pool-1-thread-4 任务执行完毕:Task 3
pool-1-thread-4 开始执行任务:Task 8
pool-1-thread-3 任务执行完毕:Task 2
pool-1-thread-3 开始执行任务:Task 9
pool-1-thread-2 开始执行任务:Task 5
pool-1-thread-5 开始执行任务:Task 7
pool-1-thread-2 任务执行完毕:Task 5
pool-1-thread-3 任务执行完毕:Task 9
pool-1-thread-4 任务执行完毕:Task 8
pool-1-thread-5 任务执行完毕:Task 7
pool-1-thread-1 任务执行完毕:Task 6
所有线程执行完毕如果现有的线程池类型不能满足需求,可以自定义线程池。自定义线程池可以根据具体需求配置线程的核心数量、最大数量、任务队列等参数。
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class CustomThreadPoolExample {
public static void main(String[] args) {
// 创建一个自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
10, // 空闲线程存活时间
TimeUnit.SECONDS, // 存活时间单位
new LinkedBlockingQueue<Runnable>() // 无界任务队列
);
// 提交任务到线程池
for (int i = 0; i < 6; i++) {
Runnable worker = new WorkerThread("Task " + i, executor);
executor.execute(worker);
}
// 关闭线程池
executor.shutdown();
// 等待所有线程执行完毕
while (!executor.isTerminated()) {
// 等待
}
// 输出所有线程执行完毕
System.out.println("所有线程执行完毕");
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
private ThreadPoolExecutor executor; // 线程池
// 构造函数,用于初始化任务描述信息和线程池
public WorkerThread(String s, ThreadPoolExecutor executor) {
this.task = s;
this.executor = executor;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 获取当前线程名字
String threadName = Thread.currentThread().getName();
// 输出当前线程名字、任务开始信息
System.out.println("线程 " + threadName + " 开始执行任务:" + task);
// 获取当前线程池中的核心线程数
int corePoolSize = executor.getCorePoolSize();
// 判断当前线程是否为核心线程
boolean isCoreThread = corePoolSize > 0;
// 输出是否为核心线程信息
System.out.println("线程 " + threadName + " 是否为核心线程:" + isCoreThread);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println("线程 " + threadName + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}线程 pool-1-thread-2 开始执行任务:Task 1
线程 pool-1-thread-1 开始执行任务:Task 0
线程 pool-1-thread-2 是否为核心线程:true
线程 pool-1-thread-1 是否为核心线程:true
线程 pool-1-thread-1 任务执行完毕:Task 0
线程 pool-1-thread-2 任务执行完毕:Task 1
线程 pool-1-thread-2 开始执行任务:Task 3
线程 pool-1-thread-2 是否为核心线程:true
线程 pool-1-thread-1 开始执行任务:Task 2
线程 pool-1-thread-1 是否为核心线程:true
线程 pool-1-thread-1 任务执行完毕:Task 2
线程 pool-1-thread-1 开始执行任务:Task 4
线程 pool-1-thread-1 是否为核心线程:true
线程 pool-1-thread-2 任务执行完毕:Task 3
线程 pool-1-thread-2 开始执行任务:Task 5
线程 pool-1-thread-2 是否为核心线程:true
线程 pool-1-thread-1 任务执行完毕:Task 4
线程 pool-1-thread-2 任务执行完毕:Task 5
所有线程执行完毕这个运行结果是一个线程池中的任务执行过程的输出。:
线程 pool-1-thread-2 开始执行任务:Task 1: 线程池中的第二个线程开始执行任务 “Task 1”。线程 pool-1-thread-1 开始执行任务:Task 0: 线程池中的第一个线程开始执行任务 “Task 0”。线程 pool-1-thread-2 是否为核心线程:true: 线程池中的第二个线程是一个核心线程。线程 pool-1-thread-1 是否为核心线程:true: 线程池中的第一个线程是一个核心线程。线程 pool-1-thread-1 任务执行完毕:Task 0: 线程池中的第一个线程完成了任务 “Task 0”。线程 pool-1-thread-2 任务执行完毕:Task 1: 线程池中的第二个线程完成了任务 “Task 1”。线程 pool-1-thread-2 开始执行任务:Task 3: 第二个线程开始执行任务 “Task 3”。线程 pool-1-thread-2 是否为核心线程:true: 第二个线程仍然是一个核心线程。线程 pool-1-thread-1 开始执行任务:Task 2: 第一个线程开始执行任务 “Task 2”。线程 pool-1-thread-1 是否为核心线程:true: 第一个线程仍然是一个核心线程。线程 pool-1-thread-1 任务执行完毕:Task 2: 第一个线程完成了任务 “Task 2”。线程 pool-1-thread-1 开始执行任务:Task 4: 第一个线程开始执行任务 “Task 4”。线程 pool-1-thread-1 是否为核心线程:true: 第一个线程仍然是一个核心线程。线程 pool-1-thread-2 任务执行完毕:Task 3: 第二个线程完成了任务 “Task 3”。线程 pool-1-thread-2 开始执行任务:Task 5: 第二个线程开始执行任务 “Task 5”。线程 pool-1-thread-2 是否为核心线程:true: 第二个线程仍然是一个核心线程。线程 pool-1-thread-1 任务执行完毕:Task 4: 第一个线程完成了任务 “Task 4”。线程 pool-1-thread-2 任务执行完毕:Task 5: 第二个线程完成了任务 “Task 5”。所有线程执行完毕: 所有任务都被线程池中的线程执行完毕了。。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CoreThreadPoolExample {
public static void main(String[] args) {
// 设置核心线程数为2
int corePoolSize = 2;
// 创建一个线程池,指定核心线程数
ExecutorService executor = Executors.newFixedThreadPool(corePoolSize);
// 提交任务到线程池
for (int i = 0; i < 5; i++) {
Runnable worker = new WorkerThread("Task " + i);
executor.execute(worker);
}
// 关闭线程池
executor.shutdown();
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
// 构造函数,用于初始化任务描述信息
public WorkerThread(String s) {
this.task = s;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 获取当前线程名字
String threadName = Thread.currentThread().getName();
// 输出当前线程名字、任务开始信息
System.out.println("线程 " + threadName + " 开始执行任务:" + task);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println("线程 " + threadName + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}线程 pool-1-thread-1 开始执行任务:Task 0
线程 pool-1-thread-2 开始执行任务:Task 1
线程 pool-1-thread-2 任务执行完毕:Task 1
线程 pool-1-thread-1 任务执行完毕:Task 0
线程 pool-1-thread-2 开始执行任务:Task 2
线程 pool-1-thread-1 开始执行任务:Task 3
线程 pool-1-thread-2 任务执行完毕:Task 2
线程 pool-1-thread-1 任务执行完毕:Task 3
线程 pool-1-thread-2 开始执行任务:Task 4
线程 pool-1-thread-2 任务执行完毕:Task 4import java.util.concurrent.*;
public class CustomThreadPoolExample {
public static void main(String[] args) {
int corePoolSize = 5; // 设置核心线程数
int maxPoolSize = 10; // 设置最大线程数
long keepAliveTime = 60; // 设置线程空闲时间
TimeUnit unit = TimeUnit.SECONDS; // 设置空闲时间单位
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100); // 设置任务队列
// 创建线程池
ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);
// 提交任务到线程池
for (int i = 0; i < 15; i++) {
Runnable worker = new WorkerThread("Task " + i);
executor.execute(worker);
}
// 关闭线程池
executor.shutdown();
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
// 构造函数,用于初始化任务描述信息
public WorkerThread(String s) {
this.task = s;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 获取当前线程名字
String threadName = Thread.currentThread().getName();
// 输出当前线程名字、任务开始信息
System.out.println("线程 " + threadName + " 开始执行任务:" + task);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println("线程 " + threadName + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}import java.util.concurrent.*;
public class KeepAliveTimeExample {
public static void main(String[] args) {
int corePoolSize = 3; // 设置核心线程数
int maxPoolSize = 5; // 设置最大线程数
long keepAliveTime = 3; // 设置空闲线程存活时间(秒)
TimeUnit unit = TimeUnit.SECONDS; // 设置空闲时间单位
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10); // 设置任务队列
// 创建线程池,并设置空闲线程存活时间
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);
// 提交任务到线程池
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("Task " + i);
executor.execute(worker);
}
// 关闭线程池
executor.shutdown();
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
// 构造函数,用于初始化任务描述信息
public WorkerThread(String s) {
this.task = s;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 获取当前线程名字
String threadName = Thread.currentThread().getName();
// 输出当前线程名字、任务开始信息
System.out.println("线程 " + threadName + " 开始执行任务:" + task);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println("线程 " + threadName + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}ArrayBlockingQueue、LinkedBlockingQueue等)具有不同的特性,如有界性、无界性等。import java.util.concurrent.*;
public class WorkQueueExample {
public static void main(String[] args) {
int corePoolSize = 3; // 设置核心线程数
int maxPoolSize = 5; // 设置最大线程数
long keepAliveTime = 3; // 设置空闲线程存活时间(秒)
TimeUnit unit = TimeUnit.SECONDS; // 设置空闲时间单位
// 使用有界队列(ArrayBlockingQueue)
BlockingQueue<Runnable> arrayBlockingQueue = new ArrayBlockingQueue<>(10);
ThreadPoolExecutor executorWithArrayBlockingQueue = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, arrayBlockingQueue);
// 使用无界队列(LinkedBlockingQueue)
BlockingQueue<Runnable> linkedBlockingQueue = new LinkedBlockingQueue<>();
ThreadPoolExecutor executorWithLinkedBlockingQueue = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, linkedBlockingQueue);
// 提交任务到线程池(使用有界队列)
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("Task " + i);
executorWithArrayBlockingQueue.execute(worker);
}
// 提交任务到线程池(使用无界队列)
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("Task " + i);
executorWithLinkedBlockingQueue.execute(worker);
}
// 关闭线程池(使用有界队列)
executorWithArrayBlockingQueue.shutdown();
// 关闭线程池(使用无界队列)
executorWithLinkedBlockingQueue.shutdown();
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
// 构造函数,用于初始化任务描述信息
public WorkerThread(String s) {
this.task = s;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 获取当前线程名字
String threadName = Thread.currentThread().getName();
// 输出当前线程名字、任务开始信息
System.out.println("线程 " + threadName + " 开始执行任务:" + task);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println("线程 " + threadName + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}import java.util.concurrent.*;
public class RejectedExecutionHandlerExample {
public static void main(String[] args) {
int corePoolSize = 2; // 设置核心线程数
int maxPoolSize = 3; // 设置最大线程数
long keepAliveTime = 3; // 设置空闲线程存活时间(秒)
TimeUnit unit = TimeUnit.SECONDS; // 设置空闲时间单位
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2); // 设置任务队列(有界队列)
// 创建线程池,并设置空闲线程存活时间和拒绝策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);
// 设置四种不同的拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); // 中止策略
//executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); // 丢弃策略
//executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy()); // 丢弃最旧策略
//executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 调用者运行策略
// 提交任务到线程池
for (int i = 0; i < 5; i++) {
Runnable worker = new WorkerThread("Task " + i);
executor.execute(worker);
}
// 关闭线程池
executor.shutdown();
}
// 定义一个实现了Runnable接口的WorkerThread类
static class WorkerThread implements Runnable {
private String task; // 任务描述信息
// 构造函数,用于初始化任务描述信息
public WorkerThread(String s) {
this.task = s;
}
// 实现Runnable接口的run方法,执行具体的任务逻辑
public void run() {
// 获取当前线程名字
String threadName = Thread.currentThread().getName();
// 输出当前线程名字、任务开始信息
System.out.println("线程 " + threadName + " 开始执行任务:" + task);
// 模拟任务执行,线程休眠2秒
processCommand();
// 输出当前线程名字、任务结束信息
System.out.println("线程 " + threadName + " 任务执行完毕:" + task);
}
// 模拟任务执行的方法
private void processCommand() {
try {
Thread.sleep(2000); // 休眠2秒,模拟任务执行耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class WebServer {
private static final int MAX_THREADS = 100; // 最大线程数
public static void main(String[] args) {
// 创建一个固定大小的线程池,用于处理客户端请求
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
// 模拟客户端请求
for (int i = 0; i < 20; i++) {
// 创建客户端请求任务并提交给线程池执行
executor.execute(new ClientRequest("Request " + i));
}
// 关闭线程池
executor.shutdown();
}
// 定义一个模拟客户端请求的任务类
static class ClientRequest implements Runnable {
private String request;
// 构造函数,初始化客户端请求信息
public ClientRequest(String request) {
this.request = request;
}
@Override
public void run() {
// 模拟处理客户端请求的业务逻辑
processRequest();
}
// 模拟处理客户端请求的业务逻辑
private void processRequest() {
// 输出开始处理请求的信息
System.out.println("开始处理客户端请求:" + request);
try {
// 模拟处理请求的耗时操作
Thread.sleep(1000);
// 输出请求处理完成的信息
System.out.println("请求处理完成:" + request);
} catch (InterruptedException e) {
// 输出请求处理被中断的信息
System.out.println("请求处理被中断:" + request);
}
}
}
}开始处理客户端请求:Request 0
开始处理客户端请求:Request 2
开始处理客户端请求:Request 1
开始处理客户端请求:Request 3
开始处理客户端请求:Request 4
开始处理客户端请求:Request 5
开始处理客户端请求:Request 6
开始处理客户端请求:Request 7
开始处理客户端请求:Request 8
开始处理客户端请求:Request 9
开始处理客户端请求:Request 10
开始处理客户端请求:Request 12
开始处理客户端请求:Request 11
开始处理客户端请求:Request 13
开始处理客户端请求:Request 14
开始处理客户端请求:Request 15
开始处理客户端请求:Request 16
开始处理客户端请求:Request 18
开始处理客户端请求:Request 19
开始处理客户端请求:Request 17
请求处理完成:Request 13
请求处理完成:Request 0
请求处理完成:Request 8
请求处理完成:Request 7
请求处理完成:Request 16
请求处理完成:Request 6
请求处理完成:Request 14
请求处理完成:Request 5
请求处理完成:Request 3
请求处理完成:Request 15
请求处理完成:Request 4
请求处理完成:Request 19
请求处理完成:Request 2
请求处理完成:Request 1
请求处理完成:Request 12
请求处理完成:Request 11
请求处理完成:Request 10
请求处理完成:Request 9
请求处理完成:Request 18
请求处理完成:Request 17import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class DatabaseConnectionPool {
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String DB_USER = "username";
private static final String DB_PASSWORD = "password";
private static final int POOL_SIZE = 10; // 连接池大小
private BlockingQueue<Connection> connectionPool; // 连接池
private ExecutorService executorService; // 线程池
public DatabaseConnectionPool() {
// 初始化连接池
connectionPool = new ArrayBlockingQueue<>(POOL_SIZE);
// 初始化线程池
executorService = Executors.newCachedThreadPool();
// 初始化连接池中的连接
for (int i = 0; i < POOL_SIZE; i++) {
try {
Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
connectionPool.put(connection);
} catch (SQLException | InterruptedException e) {
e.printStackTrace();
}
}
}
// 从连接池中获取连接
public Connection getConnection() throws InterruptedException {
return connectionPool.take();
}
// 将连接放回连接池
public void releaseConnection(Connection connection) throws InterruptedException {
if (connection != null) {
connectionPool.put(connection);
}
}
// 关闭连接池
public void closePool() {
if (executorService != null && !executorService.isShutdown()) {
executorService.shutdown();
}
connectionPool.forEach(connection -> {
try {
if (connection != null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
});
}
}在这个数据库连接池的示例中,采用了基于阻塞队列的方式来实现连接池的管理,以及使用线程池来处理数据库连接的请求。
getConnection() 方法用于从连接池中获取连接,releaseConnection() 方法用于将连接放回连接池。closePool() 方法用于关闭连接池,在关闭之前会确保连接池中的所有连接都被正确地关闭。import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ImageProcessor {
private static final String IMAGE_DIRECTORY = "/path/to/image/directory";
private static final int THREAD_POOL_SIZE = 5;
public static void main(String[] args) {
// 创建固定大小的线程池
ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
// 获取图像文件列表
File imageDirectory = new File(IMAGE_DIRECTORY);
File[] imageFiles = imageDirectory.listFiles();
// 处理每张图片
if (imageFiles != null) {
for (File imageFile : imageFiles) {
// 提交任务给线程池处理
executor.submit(new ImageTask(imageFile));
}
}
// 关闭线程池
executor.shutdown();
}
// 图像处理任务类
static class ImageTask implements Runnable {
private File imageFile;
public ImageTask(File imageFile) {
this.imageFile = imageFile;
}
@Override
public void run() {
// 执行图像处理逻辑
processImage(imageFile);
}
// 图像处理逻辑
private void processImage(File imageFile) {
System.out.println("处理图像文件:" + imageFile.getName());
// 在这里编写具体的图像处理逻辑
// 例如,缩放、裁剪、滤镜等操作
}
}
}这个示例演示了如何使用线程池处理图像文件。主要步骤包括:
Executors.newFixedThreadPool() 方法创建一个固定大小的线程池,指定了线程池的大小为 5。ImageTask 任务,并将其提交给线程池执行。ImageTask 类实现了 Runnable 接口,其中的 run() 方法定义了图像处理的逻辑。在 processImage() 方法中,可以编写具体的图像处理逻辑,例如图像缩放、裁剪、添加滤镜等操作。shutdown() 方法关闭线程池。import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileTransferManager {
private static final String UPLOAD_DIRECTORY = "/path/to/upload/directory";
private static final int THREAD_POOL_SIZE = 5;
public static void main(String[] args) {
// 创建固定大小的线程池
ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
// 获取上传目录中的文件列表
File uploadDirectory = new File(UPLOAD_DIRECTORY);
File[] files = uploadDirectory.listFiles();
// 处理每个文件(模拟上传下载任务)
if (files != null) {
for (File file : files) {
// 提交上传下载任务给线程池处理
executor.submit(new FileTransferTask(file));
}
}
// 关闭线程池
executor.shutdown();
}
// 文件传输任务类
static class FileTransferTask implements Runnable {
private File file;
public FileTransferTask(File file) {
this.file = file;
}
@Override
public void run() {
// 执行文件上传下载逻辑
transferFile(file);
}
// 文件上传下载逻辑
private void transferFile(File file) {
System.out.println("处理文件:" + file.getName());
// 在这里编写具体的文件上传下载逻辑
// 例如,将文件上传到远程服务器,或者从远程服务器下载文件等操作
}
}
}这个示例展示了如何使用线程池处理文件上传下载任务。主要步骤如下:
Executors.newFixedThreadPool() 方法创建一个固定大小的线程池,指定了线程池的大小为 5。FileTransferTask 任务,并将其提交给线程池执行。FileTransferTask 类实现了 Runnable 接口,其中的 run() 方法定义了文件上传下载的逻辑。在 transferFile() 方法中,可以编写具体的文件上传下载逻辑,例如将文件上传到远程服务器,或者从远程服务器下载文件等操作。shutdown() 方法关闭线程池。