大家好,我是程序员影子
一名致力于帮助更多朋友快速入门编程的程序猿
今天来聊一聊关于Java中的线程池的实践
一、线程池的基本概念
线程池是一种用于管理和复用线程的机制,它可以减少创建和销毁线程的开销,提高线程的利用率。Java中通过ExecutorService
接口来表示线程池。
demo:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交任务到线程池
for (int i = 0; i < 10; i++) {
executorService.submit(() -> {
System.out.println("执行任务: " + Thread.currentThread().getName());
});
}
// 关闭线程池
executorService.shutdown();
}
}
二、线程池的创建方式
Java提供了几种创建线程池的方式,包括newFixedThreadPool
、newCachedThreadPool
、newSingleThreadExecutor
等。
demo:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolCreation {
public static void main(String[] args) {
// 创建一个固定大小的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
// 创建一个可缓存的线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 创建一个单线程的Executor
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// 示例关闭线程池
fixedThreadPool.shutdown();
cachedThreadPool.shutdown();
singleThreadExecutor.shutdown();
}
}
三、使用Future
获取任务结果
通过ExecutorService
提交的任务可以通过Future
对象来获取执行结果。
demo:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
Future<Integer> future = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 1 + 1;
}
});
try {
Integer result = future.get();
System.out.println("计算结果: " + result); // 输出结果应为2
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
}
四、自定义线程池
除了使用Executors
类提供的工厂方法创建线程池外,还可以通过ThreadPoolExecutor
构造函数自定义线程池。
demo:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class CustomThreadPool {
public static void main(String[] args) {
// 创建自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
60, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(10) // 工作队列
);
// 使用线程池执行任务
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
System.out.println("执行任务: " + Thread.currentThread().getName());
});
}
// 关闭线程池
executor.shutdown();
}
}
以上就是本次分享的所有内容,感兴趣的朋友点个关注呀,感谢大家啦~
更多Java | AI+编程玩法 的相关资料和源码请移步至公众号:程序员影子