Java 的多线程是一种在程序中同时执行多个线程的能力。线程是操作系统中最小的执行单元,可以并行执行代码,从而提高程序的效率和响应能力。在 Java 中,多线程编程允许你创建、管理和协调多个线程以实现并发任务处理。
多线程同步
多线程同步是确保多个线程在访问共享资源时能够按照预期的顺序进行操作,从而避免数据不一致或竞争条件的技术。常见的同步机制包括:
1.synchronized 关键字:用于修饰方法或代码块,以确保同一时刻只有一个线程可以访问被修饰的代码区域。
public synchronized void someMethod() {
// 线程安全的代码
}
// 或者
public void someMethod() {
synchronized(this) {
// 线程安全的代码
}
}
2.Lock 接口:java.util.concurrent.locks 包中的 Lock 接口提供了比 synchronized 更细粒度的锁控制。ReentrantLock 是常用的实现类。
Lock lock = new ReentrantLock();
lock.lock();
try {
// 线程安全的代码
} finally {
lock.unlock();
}
3.条件变量:Condition 接口与 Lock 结合使用,提供了更灵活的线程间通信机制。
Condition condition = lock.newCondition();
lock.lock();
try {
while (/* 条件不满足 */) {
condition.await();
}
// 执行代码
condition.signalAll(); // 唤醒等待的线程
} finally {
lock.unlock();
}
线程池
线程池是用于管理和复用线程的工具,可以提高系统性能,避免频繁地创建和销毁线程。Java 提供了 java.util.concurrent 包中的 Executor 框架来简化线程池的使用。主要组件包括:
1.Executor 接口:定义了提交任务的方法。
public interface Executor {
void execute(Runnable command);
}
2.ExecutorService 接口:继承自 Executor,提供了管理线程池生命周期的方法和返回结果的功能。
public interface ExecutorService extends Executor {
void shutdown(); // 关闭线程池
List<Runnable> shutdownNow(); // 立即关闭线程池
Future<?> submit(Runnable task); // 提交任务并返回 Future
<T> Future<T> submit(Callable<T> task);
}
3.ThreadPoolExecutor 类:ThreadPoolExecutor 是 ExecutorService 的一个具体实现类。可以自定义线程池的行为。
ExecutorService executor = new ThreadPoolExecutor(
10, // 核心线程数
20, // 最大线程数
60, // 空闲线程的存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<Runnable>() // 任务队列
);
executor.submit(() -> {
// 线程池中的任务
});
4.工厂方法:Executors 类提供了创建常用线程池的静态方法。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();