java自定义线程用法
时间: 2025-05-28 22:16:48 浏览: 17
### Java 中自定义线程池的使用方法
在 Java 中,可以通过继承 `ThreadPoolExecutor` 类来自定义线程池,并通过重写 `execute()` 方法来定义任务的具体执行逻辑。以下是详细的介绍以及示例代码。
#### 自定义线程池的核心概念
为了创建一个自定义线程池,通常需要以下几个核心参数[^1]:
- **corePoolSize**: 线程池中的最小线程数。
- **maximumPoolSize**: 线程池能够容纳的最大线程数量。
- **keepAliveTime**: 当前活动线程超过 corePoolSize 时,多余的空闲线程等待新任务的时间长度。
- **unit**: keepAliveTime 的时间单位。
- **workQueue**: 存放待执行任务的队列。
- **threadFactory**: 创建线程的工厂类,默认情况下会为每个线程分配一个新的名称。
- **handler**: 饱和策略,当线程池无法继续接收新的任务时所采取的行为。
#### 示例代码:自定义线程池
以下是一个完整的自定义线程池实现及其使用的例子:
```java
import java.util.concurrent.*;
public class CustomThreadPool extends ThreadPoolExecutor {
public CustomThreadPool(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
System.out.println("Task is about to start on thread: " + t.getName());
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
System.out.println("Task has finished.");
}
@Override
protected void terminated() {
System.out.println("The thread pool has been shut down.");
}
}
class Task implements Runnable {
private final String name;
public Task(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println("Executing task: " + name);
Thread.sleep(2000); // Simulate some processing time.
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
CustomThreadPool customThreadPool =
new CustomThreadPool(
2, // Core Pool Size
4, // Maximum Pool Size
1L, // Keep Alive Time
TimeUnit.SECONDS, // Unit of Keep Alive Time
new LinkedBlockingQueue<>(10)); // Work Queue with capacity 10
for (int i = 1; i <= 5; i++) {
customThreadPool.execute(new Task("Task-" + i));
}
customThreadPool.shutdown(); // Initiate shutdown sequence.
customThreadPool.awaitTermination(60, TimeUnit.SECONDS); // Wait until all tasks are completed or timeout occurs.
if (!customThreadPool.isTerminated()) {
System.err.println("Not all tasks were executed within the given timeframe!");
}
}
}
```
上述代码展示了如何扩展 `ThreadPoolExecutor` 来构建一个自定义线程池,并提供了简单的任务提交机制。注意在线程池不再被使用时调用了 `shutdown()` 和 `awaitTermination()` 方法以确保资源释放[^4]。
#### 多线程的任务分离方式
除了通过线程池管理多线程外,还可以采用其他几种常见的多线程实现方式[^2]:
1. 继承 `Thread` 类并覆盖 `run()` 方法;
2. 实现 `Runnable` 接口并通过外部容器启动线程;
3. 利用匿名内部类简化编码过程(适用于简单场景)。
每种方式都有各自的优缺点,在实际开发过程中应根据需求选择合适的方式。
---
阅读全文
相关推荐



















