Java 中的多线程实现方式
Java 提供了多种实现多线程的方式,以下是主要的实现方法及其特点:
一、基础实现方式
1. 继承 Thread 类
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行: " + Thread.currentThread().getName());
}
}
// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
特点:
- 简单直接
- 由于Java单继承限制,扩展性较差
- 线程与任务耦合
2. 实现 Runnable 接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程执行: " + Thread.currentThread().getName());
}
}
// 使用
Thread thread = new Thread(new MyRunnable());
thread.start();
特点:
- 推荐使用方式
- 实现接口,避免单继承限制
- 线程与任务解耦
- 便于线程池管理
3. 实现 Callable 接口
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Callable执行结果: " + Thread.currentThread().getName();
}
}
// 使用
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new MyCallable());
System.out.println(future.get()); // 获取返回值
executor.shutdown();
特点:
- 可以返回结果
- 可以抛出异常
- 通常与ExecutorService配合使用
二、线程池实现方式
1. 使用 Executor 框架
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(() -> {
System.out.println("线程池执行任务");
});
executor.shutdown();
2. 常用线程池类型
- FixedThreadPool:固定大小线程池
- CachedThreadPool:可缓存线程池
- SingleThreadExecutor:单线程池
- ScheduledThreadPool:定时任务线程池
- WorkStealingPool (Java 8+):工作窃取线程池
三、高级并发工具
1. Future 和 FutureTask
FutureTask<String> futureTask = new FutureTask<>(() -> {
return "FutureTask结果";
});
new Thread(futureTask).start();
System.out.println(futureTask.get());
2. CompletableFuture (Java 8+)
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World")
.thenAccept(System.out::println);
3. Fork/Join 框架
class MyTask extends RecursiveTask<Integer> {
@Override
protected Integer compute() {
// 任务拆分和合并逻辑
return 100;
}
}
ForkJoinPool pool = new ForkJoinPool();
Integer result = pool.invoke(new MyTask());
四、并发集合
Java提供了一系列线程安全的集合类:
ConcurrentHashMapCopyOnWriteArrayListBlockingQueue及其实现类 (ArrayBlockingQueue,LinkedBlockingQueue)ConcurrentLinkedQueue
五、同步机制
1. 基本同步
synchronized关键字volatile关键字
2. Lock 接口及其实现
ReentrantLockReentrantReadWriteLockStampedLock(Java 8+)
3. 其他同步工具
CountDownLatchCyclicBarrierSemaphorePhaser(Java 7+)Exchanger
六、异步编程
1. 回调机制
interface Callback {
void onComplete(String result);
}
class AsyncTask {
void execute(Callback callback) {
new Thread(() -> {
String result = "处理结果";
callback.onComplete(result);
}).start();
}
}
2. Reactor 模式
(通过第三方库如Netty、Vert.x等实现)
七、选择建议
- 简单任务:实现Runnable接口或使用lambda表达式
- 需要返回值:使用Callable+Future或CompletableFuture
- 高并发场景:使用线程池管理
- 并行计算:考虑Fork/Join框架
- 异步编程:Java 8+推荐使用CompletableFuture
- 定时任务:使用ScheduledExecutorService
八、最佳实践
- 优先使用线程池而非直接创建线程
- 合理设置线程池大小
- 注意资源共享的线程安全问题
- 使用更高级的并发工具替代低级的wait/notify
- 考虑使用不可变对象减少同步需求
- 注意死锁、活锁和线程饥饿问题
Java的多线程实现方式随着版本演进不断丰富,从Java 5的并发工具包到Java 8的CompletableFuture和并行流,开发者可以根据具体需求选择最适合的实现方式。

被折叠的 条评论
为什么被折叠?



