返回

并发工具类:管理线程的实用工具

后端

1. Semaphore

Semaphore是一种用于控制对共享资源的访问的工具。它允许一定数量的线程同时访问共享资源,而当超过该数量的线程试图访问共享资源时,它们将被阻塞,直到有可用资源为止。Semaphore的用法非常简单,只需要创建一个Semaphore对象,并指定其初始许可证数量即可。

// 创建一个初始许可证数量为1的Semaphore
Semaphore semaphore = new Semaphore(1);

// 线程1尝试获取许可证
semaphore.acquire();

// 线程2尝试获取许可证
semaphore.acquire();

// 线程3尝试获取许可证,但被阻塞
semaphore.acquire();

// 线程1释放许可证
semaphore.release();

// 线程2释放许可证
semaphore.release();

// 线程3获取许可证
semaphore.acquire();

2. CyclicBarrier

CyclicBarrier是一种用于等待一组线程都到达某个屏障的工具。当所有线程都到达屏障时,CyclicBarrier将释放所有线程,继续执行。CyclicBarrier的用法也非常简单,只需要创建一个CyclicBarrier对象,并指定其等待的线程数量即可。

// 创建一个等待3个线程的CyclicBarrier
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

// 线程1到达屏障
cyclicBarrier.await();

// 线程2到达屏障
cyclicBarrier.await();

// 线程3到达屏障
cyclicBarrier.await();

// 所有线程都到达屏障,继续执行

3. CountDownLatch

CountDownLatch是一种用于等待一组任务都完成的工具。当所有任务都完成时,CountDownLatch将释放所有等待的线程,继续执行。CountDownLatch的用法也非常简单,只需要创建一个CountDownLatch对象,并指定其等待的任务数量即可。

// 创建一个等待3个任务的CountDownLatch
CountDownLatch countDownLatch = new CountDownLatch(3);

// 任务1完成
countDownLatch.countDown();

// 任务2完成
countDownLatch.countDown();

// 任务3完成
countDownLatch.countDown();

// 所有任务都完成,继续执行
countDownLatch.await();

4. Executors

Executors是一种创建线程池的工具。线程池是一种管理线程的机制,可以提高应用程序的性能和可扩展性。Executors提供了多种创建线程池的方法,包括:

  • newFixedThreadPool:创建一个固定大小的线程池,该线程池中的线程数量不会动态调整。
  • newCachedThreadPool:创建一个可伸缩的线程池,该线程池中的线程数量可以根据需要动态调整。
  • newSingleThreadExecutor:创建一个只有一个线程的线程池,该线程池中的线程可以顺序执行任务。
// 创建一个固定大小的线程池,该线程池中的线程数量为3
ExecutorService executorService = Executors.newFixedThreadPool(3);

// 提交任务到线程池
executorService.submit(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
});

// 提交任务到线程池
executorService.submit(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
});

// 等待所有任务执行完成
executorService.shutdown();

5. 总结

Semaphore、CyclicBarrier、CountDownLatch和Executors是Java中常用的并发工具类。了解这些工具的功能和用法,可以帮助您编写更健壮、更可扩展的并发程序。