在Java编程中,多线程和并发机制是构建高性能应用程序的关键技术。本文将详细介绍多线程相关的类及其分类,并探讨如何使用这些类来简化多线程编程。
一、多线程类的分类
Java中的多线程类可以分为以下几类:
- 可执行对象
- 执行器
- 工具类
- 容器
- 并发控制
1. 可执行对象
可执行对象是多线程的基本单元,主要包括以下几种:
1.1 Runnable接口
Runnable接口是最基本的多线程执行单元。通过实现`run()`方法,可以在单独的线程中执行任务。
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // 计算大于minPrime的素数 ... } } PrimeThread p = new PrimeThread(143); p.start();
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // 计算大于minPrime的素数 ... } } PrimeRun p = new PrimeRun(143); new Thread(p).start();
Runnable接口的定义非常简单:
package java.lang; public interface Runnable { public abstract void run(); }
而Thread类则更为复杂,它实现了Runnable接口,因此继承自Thread的类需要实现`run()`方法。
package java.lang; public class Thread implements Runnable { // 因为Thread继承了Runnable,所以继承自Thread的类要实现run方法 ... }
1.2 Callable接口
Callable接口类似于Runnable,但可以返回结果并抛出checked异常。
package java.util.concurrent; public interface Callable { V call() throws Exception; // 泛型V定义了返回的类型 }
1.3 Future接口
Future接口表示一个异步计算的结果。它可以检查计算是否完成、等待计算完成以及获取计算结果。
package java.util.concurrent; public interface Future { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
FutureTask类实现了Runnable和Future接口,因此可以将其提交给Executor执行。
二、执行器框架
执行器框架提供了管理和调度任务的高级机制。
2.1 Executor接口
Executor接口用于管理任务的执行。
package java.util.concurrent; public interface Executor { void execute(Runnable command); // 执行Runnable任务,返回void }
2.2 ExecutorService接口
ExecutorService接口扩展了Executor接口,提供了更丰富的功能,如管理生命周期、提交任务并返回Future等。
package java.util.concurrent; public interface ExecutorService extends Executor { void shutdown(); List shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; Future submit(Callable task); Future submit(Runnable task, T result); Future> submit(Runnable task); List> invokeAll(Collection extends Callable> tasks) throws InterruptedException; List> invokeAll(Collection extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException; T invokeAny(Collection extends Callable> tasks) throws InterruptedException, ExecutionException; T invokeAny(Collection extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
常见的实现类包括`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。
2.3 CompletionService接口
CompletionService接口用于管理和获取已完成的任务结果。
三、并发容器
Java并发包提供了多种线程安全的容器,如`BlockingDeque`等。
四、并发控制工具
并发控制工具用于协调多个线程的执行,常见的有`Synchronized`、`CountDownLatch`等。
五、工具类
Java并发包还提供了一些工厂和工具方法,如`Executors`类。
相关文章:
1. 高可用架构—并发之痛 Thread,Goroutine,Actor
参考:
1. Java并发性和多线程介绍目录:http://ifeve.com/java-concurrency-thread-directory/
2. Doug Lea并发编程文章全部译文:http://ifeve.com/doug-lea/