Java线程池的核心参数
Java线程池通过ThreadPoolExecutor类进行配置,其核心参数如下:
-  
corePoolSize(核心线程数)
-  
作用:线程池中保持活动的最小线程数,即使这些线程处于空闲状态。
 -  
行为:默认情况下,核心线程不会因空闲超时被回收(除非设置
allowCoreThreadTimeOut(true))。 
 -  
 -  
maximumPoolSize(最大线程数)
-  
作用:线程池允许创建的最大线程数(包括核心线程和非核心线程)。
 -  
触发条件:当核心线程全忙且阻塞队列已满时,会创建临时线程,直到达到此值。
 
 -  
 -  
keepAliveTime(空闲线程存活时间)
-  
作用:非核心线程(临时线程)在空闲状态下的存活时间,超时后会被终止。
 -  
单位:通过
TimeUnit指定(如秒、毫秒)。 
 -  
 -  
workQueue(阻塞队列)
-  
作用:存储等待执行的任务。
 -  
常用类型:
-  
LinkedBlockingQueue:无界队列(默认容量极大,需警惕内存溢出)。 -  
ArrayBlockingQueue:有界队列(需指定容量)。 -  
SynchronousQueue:不存储任务,直接提交给线程处理。 
 -  
 
 -  
 -  
threadFactory(线程工厂)
-  
作用:自定义线程的创建方式(如设置线程名称、优先级)。
 -  
示例:
java
复制
下载
ThreadFactory factory = r -> {Thread t = new Thread(r);t.setName("custom-thread-" + t.getId());return t; }; 
 -  
 -  
handler(拒绝策略)
-  
作用:当线程池和队列均满时,处理新提交的任务。
 -  
内置策略:
-  
AbortPolicy(默认):抛出RejectedExecutionException。 -  
CallerRunsPolicy:由提交任务的线程直接执行。 -  
DiscardPolicy:静默丢弃任务。 -  
DiscardOldestPolicy:丢弃队列中最旧的任务,重新提交当前任务。 
 -  
 
 -  
 
Java中线程的创建方式
-  
继承Thread类
java
复制
下载
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running");} } MyThread t = new MyThread(); t.start(); -  
实现Runnable接口
java
复制
下载
Runnable task = () -> System.out.println("Runnable running"); Thread t = new Thread(task); t.start(); -  
实现Callable接口(支持返回值)
java
复制
下载
Callable<String> task = () -> "Result"; ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(task); String result = future.get(); // 阻塞获取结果 executor.shutdown();
 -  
使用线程池(推荐)
java
复制
下载
ExecutorService executor = Executors.newFixedThreadPool(4); executor.submit(() -> System.out.println("Task executed by thread pool")); executor.shutdown(); 
线程(Thread)与进程(Process)的区别
| 特性 | 进程 | 线程 | 
|---|---|---|
| 资源分配 | 独立内存空间(堆、栈、系统资源) | 共享进程的内存空间(堆),独立栈 | 
| 创建开销 | 大(需分配独立资源) | 小(共享进程资源) | 
| 通信方式 | 复杂(如管道、Socket、共享内存) | 简单(直接共享内存,但需同步控制) | 
| 切换成本 | 高(涉及上下文切换和资源切换) | 低(仅切换线程上下文) | 
| 独立性 | 一个进程崩溃不影响其他进程 | 一个线程崩溃可能导致整个进程终止 | 
| 应用场景 | 需要隔离的任务(如浏览器多标签页) | 高并发任务(如Web服务器处理请求) | 
线程池的工作流程
-  
任务提交
-  
若核心线程未满,立即创建新线程执行。
 -  
若核心线程全忙,任务进入阻塞队列。
 
 -  
 -  
队列处理
-  
队列未满时,任务排队等待核心线程处理。
 -  
队列已满时,创建临时线程(直到达到
maximumPoolSize)。 
 -  
 -  
拒绝策略触发
-  
当线程池和队列均满时,执行拒绝策略。
 
 -  
 
示例:自定义线程池
java
复制
下载
ThreadPoolExecutor executor = new ThreadPoolExecutor(2,                              // corePoolSize4,                              // maximumPoolSize60, TimeUnit.SECONDS,           // keepAliveTimenew ArrayBlockingQueue<>(10),    // workQueuenew CustomThreadFactory(),      // threadFactorynew ThreadPoolExecutor.CallerRunsPolicy() // handler
);// 提交任务
for (int i = 0; i < 15; i++) {executor.submit(() -> {try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + " 执行任务");} catch (InterruptedException e) {e.printStackTrace();}});
}executor.shutdown(); 
总结
-  
线程池核心参数:需根据任务类型(CPU/IO密集型)合理配置。
 -  
线程创建方式:推荐使用线程池管理线程,避免频繁创建销毁开销。
 -  
线程与进程:线程轻量且共享资源,适合高并发;进程隔离性强,适合需要独立环境的任务。