Java 并发编程(Java Concurrency)是指在 Java 程序中同时进行多个任务的一种编程方式。Java 提供了一套丰富的并发编程工具,其中包括 Java 并发包(Java Concurrency Utilities,简称 JUC),用于简化并发编程的复杂性。
以下是 Java 并发编程中一些常用的 JUC 工具和概念:
-
线程池(Executor Framework):
ExecutorService
接口:用于管理和控制线程的执行,提供了提交任务、获取 Future 结果等方法。Executors
工具类:提供了创建不同类型线程池的静态方法。
ExecutorService executorService = Executors.newFixedThreadPool(5); executorService.submit(() -> System.out.println("Task executed in thread pool"));
-
Callable 和 Future:
Callable
接口:类似于Runnable
,但可以返回结果,并且可以抛出异常。Future
接口:表示异步计算的结果,可以用于获取计算的结果或取消任务的执行。
Callable<Integer> callableTask = () -> {// Perform some computationreturn 42; };Future<Integer> future = executorService.submit(callableTask); Integer result = future.get();
-
并发集合:
ConcurrentHashMap
:线程安全的哈希表。CopyOnWriteArrayList
和CopyOnWriteArraySet
:基于写时复制的并发列表和集合。
Map<String, String> concurrentMap = new ConcurrentHashMap<>(); List<String> copyOnWriteList = new CopyOnWriteArrayList<>();
-
原子操作类:
AtomicInteger
、AtomicLong
、AtomicReference
等:提供了原子操作的基本类型。
AtomicInteger atomicInteger = new AtomicInteger(0); atomicInteger.incrementAndGet();
-
CountDownLatch:
- 用于等待其他线程完成一组操作。
CountDownLatch latch = new CountDownLatch(3);// 在其他线程中调用 latch.countDown(),表示任务完成 latch.await(); // 阻塞当前线程,直到 latch 计数器减为零
-
CyclicBarrier:
- 用于等待一组线程达到某个屏障点。
CyclicBarrier barrier = new CyclicBarrier(3);// 在其他线程中调用 barrier.await(),等待所有线程都到达屏障点
-
Semaphore:
- 用于控制同时访问某个资源的线程数量。
Semaphore semaphore = new Semaphore(2); // 允许两个线程同时访问// 在线程中调用 semaphore.acquire() 获取许可,semaphore.release() 释放许可
-
Lock 接口和 ReentrantLock:
- 提供了比使用
synchronized
更灵活的锁定操作。
Lock lock = new ReentrantLock();lock.lock(); try {// 执行需要同步的代码块 } finally {lock.unlock(); }
- 提供了比使用
以上是一些 JUC 工具和概念的简要介绍,通过这些工具,Java 并发编程变得更加方便和高效。在实际应用中,具体选择哪种工具取决于任务的性质和要求。