买完域名以后怎么做网站,wordpress没中文插件,百度开户推广多少钱,汕头微信推广平台目录
Java 并发工具
1. Executor 框架
1.1 线程池
1.2 ExecutorService 和 Future
2. 同步辅助类
2.1 CountDownLatch
2.2 Semaphore
3. 并发集合
3.1 ConcurrentHashMap
总结与后续 Java 并发工具
在多线程编程中#xff0c;高效管理线程和任务至关重要。Java 提供…目录
Java 并发工具
1. Executor 框架
1.1 线程池
1.2 ExecutorService 和 Future
2. 同步辅助类
2.1 CountDownLatch
2.2 Semaphore
3. 并发集合
3.1 ConcurrentHashMap
总结与后续 Java 并发工具
在多线程编程中高效管理线程和任务至关重要。Java 提供了一系列强大的并发工具帮助开发者更好地控制多线程任务的执行和资源管理。这些工具类不仅简化了线程管理实现了高效的同步操作还提高了代码的可读性和性能。本模块将深入介绍 Java 中的并发工具包括线程池、Executor 框架、同步辅助类如 CountDownLatch、Semaphore以及并发集合。
1. Executor 框架
Executor 框架是 Java 并发工具的核心部分提供了灵活的机制来创建和管理线程池。通过使用 Executor 框架开发者可以避免手动创建和管理线程的复杂性从而专注于任务的实现。
1.1 线程池
线程池是一种用于管理线程的工具它维护了一定数量的线程可以被重复使用从而减少了频繁创建和销毁线程的开销。Java 提供了 Executors 工具类来创建不同类型的线程池以满足不同的应用场景。
主要类型的线程池
固定大小线程池Fixed Thread Pool适用于负载较为稳定的场景线程数量固定。缓存线程池Cached Thread Pool适用于执行大量短期异步任务线程数可根据需要自动调整。单线程池Single Thread Executor适用于需要顺序执行任务的场景确保只有一个线程在执行任务。调度线程池Scheduled Thread Pool适用于需要在未来某个时间执行任务的场景如定时任务。
示例创建一个固定大小的线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小为3的线程池ExecutorService executor Executors.newFixedThreadPool(3);// 提交5个任务到线程池中执行for (int i 0; i 5; i) {Runnable worker new Task(i);executor.execute(worker);}// 关闭线程池拒绝新任务的提交executor.shutdown();// 等待所有任务完成while (!executor.isTerminated()) {// 可以加入一些等待逻辑如Thread.sleep}System.out.println(所有任务已完成);}
}class Task implements Runnable {private final int taskId;public Task(int id) {this.taskId id;}Overridepublic void run() {System.out.println(任务 taskId 正在执行 by Thread.currentThread().getName());try {// 模拟任务执行时间Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println(任务 taskId 被中断);}}
}说明
在上述示例中我们使用 Executors.newFixedThreadPool(3) 创建了一个固定大小为3的线程池并提交了5个任务进行执行。线程池中的线程会被重复使用来执行这些任务从而避免了频繁创建和销毁线程的开销。executor.shutdown() 方法用于关闭线程池不再接受新任务同时等待已提交的任务执行完毕。
1.2 ExecutorService 和 Future
ExecutorService 接口扩展了 Executor提供了一些用于管理任务生命周期的方法例如提交任务并获取结果。Future 接口用于表示异步计算的结果允许我们在任务完成后检索其结果或取消任务。
示例提交任务并获取返回值
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableExample {public static void main(String[] args) {// 创建一个单线程的ExecutorServiceExecutorService executor Executors.newSingleThreadExecutor();// 定义一个Callable任务可以返回结果CallableInteger callableTask () - {Thread.sleep(1000); // 模拟耗时操作return 42;};// 提交任务并获取Future对象FutureInteger future executor.submit(callableTask);try {// 获取任务的执行结果调用get()会阻塞直到任务完成System.out.println(结果: future.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {// 关闭ExecutorServiceexecutor.shutdown();}}
}说明
在这个例子中我们使用 Callable 创建了一个可以返回结果的任务并通过 Future 获取异步计算的结果。Future.get() 方法会阻塞当前线程直到任务完成并返回结果。此外ExecutorService 提供了多种提交任务的方法如 submit 和 invokeAll以满足不同的需求。
2. 同步辅助类
Java 提供了一些同步辅助类来帮助协调多个线程之间的操作例如 CountDownLatch、CyclicBarrier 和 Semaphore。这些类简化了线程间的同步和协调提高了并发编程的效率和可读性。
2.1 CountDownLatch
CountDownLatch 允许一个或多个线程等待直到其他线程完成某些操作。它使用一个计数器初始化为需要等待的线程数量每当一个线程完成操作时计数器减一。当计数器达到零时所有等待的线程被唤醒。
示例使用 CountDownLatch 等待所有任务完成
import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {int threadCount 3;// 创建一个CountDownLatch初始计数为3CountDownLatch latch new CountDownLatch(threadCount);// 启动3个工作线程for (int i 0; i threadCount; i) {new Thread(new Worker(latch, i)).start();}System.out.println(主线程等待所有工作线程完成...);// 主线程等待计数器减到零latch.await();System.out.println(所有工作线程已完成);}
}class Worker implements Runnable {private final CountDownLatch latch;private final int workerId;public Worker(CountDownLatch latch, int id) {this.latch latch;this.workerId id;}Overridepublic void run() {try {System.out.println(工作线程 workerId 正在工作);// 模拟工作时间Thread.sleep(1000 (int)(Math.random() * 2000));System.out.println(工作线程 workerId 完成工作);} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println(工作线程 workerId 被中断);} finally {// 完成工作计数器减一latch.countDown();}}
}说明
在这个例子中主线程创建了一个 CountDownLatch初始计数为3然后启动了3个工作线程。每个工作线程在完成任务后调用 latch.countDown()使计数器减一。主线程通过 latch.await() 方法等待所有工作线程完成任务计数器达到零后继续执行。
2.2 Semaphore
Semaphore 用于控制同时访问某个资源的线程数量。它维护了一个许可证集合线程在访问资源前必须获取许可证使用完毕后释放许可证。通过调整许可证的数量可以限制同时访问资源的线程数。
示例使用 Semaphore 限制访问
import java.util.concurrent.Semaphore;public class SemaphoreExample {public static void main(String[] args) {// 创建一个Semaphore许可数量为2Semaphore semaphore new Semaphore(2);// 启动5个线程尝试访问受限资源for (int i 0; i 5; i) {new Thread(new LimitedResourceTask(semaphore, i)).start();}}
}class LimitedResourceTask implements Runnable {private final Semaphore semaphore;private final int taskId;public LimitedResourceTask(Semaphore semaphore, int id) {this.semaphore semaphore;this.taskId id;}Overridepublic void run() {try {// 尝试获取许可证semaphore.acquire();System.out.println(任务 taskId 正在访问受限资源 by Thread.currentThread().getName());// 模拟资源访问时间Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println(任务 taskId 被中断);} finally {// 释放许可证semaphore.release();System.out.println(任务 taskId 释放了资源);}}
}在这个例子中我们使用 Semaphore 控制同时访问受限资源的线程数量为 2。
3. 并发集合
Java 提供了一些线程安全的并发集合类例如 ConcurrentHashMap、CopyOnWriteArrayList它们可以在多线程环境中安全地进行操作。
3.1 ConcurrentHashMap
ConcurrentHashMap 是线程安全的哈希表适用于高并发的场景。
示例使用 ConcurrentHashMap
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMapString, Integer map new ConcurrentHashMap();ExecutorService executor Executors.newFixedThreadPool(3);for (int i 0; i 3; i) {executor.execute(() - {for (int j 0; j 5; j) {map.put(Thread.currentThread().getName() - j, j);}});}executor.shutdown();while (!executor.isTerminated()) {}map.forEach((key, value) - System.out.println(key : value));}
}
在这个例子中多个线程同时向 ConcurrentHashMap 中添加数据ConcurrentHashMap 可以确保线程安全性。
总结与后续
在本模块中我们学习了 Java 的并发工具包括线程池、Executor 框架、同步辅助类如 CountDownLatch、Semaphore和并发集合。这些工具可以帮助开发者更有效地管理多线程任务提高程序的性能和可靠性。
在下一模块中我们将学习 Java 内部类探讨如何在类的内部定义类以及内部类的用途和优势帮助我们编写更紧凑和组织良好的代码结构。