Java 中的多线程实现方式
Java 中的多线程实现方式
Java 提供了多种实现多线程的方式,以下是主要的实现方法及其特点:
一、基础实现方式
1. 继承 Thread 类
class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程执行: " + Thread.currentThread().getName());}
}// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
特点:
- 简单直接
- 由于Java单继承限制,扩展性较差
- 线程与任务耦合
2. 实现 Runnable 接口
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程执行: " + Thread.currentThread().getName());}
}// 使用
Thread thread = new Thread(new MyRunnable());
thread.start();
特点:
- 推荐使用方式
- 实现接口,避免单继承限制
- 线程与任务解耦
- 便于线程池管理
3. 实现 Callable 接口
class MyCallable implements Callable<String> {@Overridepublic 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> {@Overrideprotected Integer compute() {// 任务拆分和合并逻辑return 100;}
}ForkJoinPool pool = new ForkJoinPool();
Integer result = pool.invoke(new MyTask());
四、并发集合
Java提供了一系列线程安全的集合类:
ConcurrentHashMap
CopyOnWriteArrayList
BlockingQueue
及其实现类 (ArrayBlockingQueue
,LinkedBlockingQueue
)ConcurrentLinkedQueue
五、同步机制
1. 基本同步
synchronized
关键字volatile
关键字
2. Lock 接口及其实现
ReentrantLock
ReentrantReadWriteLock
StampedLock
(Java 8+)
3. 其他同步工具
CountDownLatch
CyclicBarrier
Semaphore
Phaser
(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和并行流,开发者可以根据具体需求选择最适合的实现方式。