Java 语言 并发包 java.util.concurrent 的5个常用类使用技巧 线程池与锁

Java阿木 发布于 21 天前 4 次阅读


Java并发编程:线程池与锁的5个常用类使用技巧

在Java并发编程中,线程池与锁是两个非常重要的概念。线程池可以有效地管理线程资源,提高程序的性能;而锁则可以保证线程之间的同步,防止数据竞争。本文将围绕Java语言并发包(java.util.concurrent)中的5个常用类,探讨线程池与锁的使用技巧。

1. 线程池

线程池是Java并发编程中常用的工具之一,它可以有效地管理线程资源,避免频繁创建和销毁线程的开销。Java并发包中提供了多种线程池实现,以下列举几种常用的线程池及其使用技巧。

1.1 FixedThreadPool

FixedThreadPool是一个固定大小的线程池,它限制了线程的最大数量,当线程池中的线程数量达到上限时,新的任务会等待线程池中的线程空闲。

java

ExecutorService executor = Executors.newFixedThreadPool(5);


for (int i = 0; i < 10; i++) {


executor.execute(() -> {


System.out.println(Thread.currentThread().getName());


});


}


executor.shutdown();


1.2 CachedThreadPool

CachedThreadPool是一个根据需要创建新线程的线程池,它没有固定的大小,可以根据需要创建新线程。当线程空闲超过60秒时,会被回收。

java

ExecutorService executor = Executors.newCachedThreadPool();


for (int i = 0; i < 10; i++) {


executor.execute(() -> {


System.out.println(Thread.currentThread().getName());


});


}


executor.shutdown();


1.3 SingleThreadExecutor

SingleThreadExecutor是一个单线程的线程池,它只有一个线程,所有任务都按照提交的顺序执行。

java

ExecutorService executor = Executors.newSingleThreadExecutor();


for (int i = 0; i < 10; i++) {


executor.execute(() -> {


System.out.println(Thread.currentThread().getName());


});


}


executor.shutdown();


1.4 ScheduledThreadPool

ScheduledThreadPool是一个可以延迟或定时执行任务的线程池。它允许你提交延迟执行或周期性执行的任务。

java

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);


scheduler.schedule(() -> {


System.out.println("延迟执行");


}, 1, TimeUnit.SECONDS);


scheduler.shutdown();


2. 锁

锁是Java并发编程中保证线程同步的重要工具。Java并发包中提供了多种锁的实现,以下列举几种常用的锁及其使用技巧。

2.1 ReentrantLock

ReentrantLock是一个可重入的互斥锁,它提供了比synchronized关键字更丰富的功能。

java

ReentrantLock lock = new ReentrantLock();


lock.lock();


try {


// 临界区代码


} finally {


lock.unlock();


}


2.2 ReadWriteLock

ReadWriteLock允许多个线程同时读取数据,但只允许一个线程写入数据。

java

ReadWriteLock lock = new ReentrantReadWriteLock();


lock.readLock().lock();


try {


// 读取数据


} finally {


lock.readLock().unlock();


}

lock.writeLock().lock();


try {


// 写入数据


} finally {


lock.writeLock().unlock();


}


2.3 Condition

Condition是ReentrantLock提供的一个接口,它可以实现线程间的条件等待和通知。

java

ReentrantLock lock = new ReentrantLock();


Condition condition = lock.newCondition();


lock.lock();


try {


condition.await();


// 等待条件满足


} catch (InterruptedException e) {


e.printStackTrace();


} finally {


lock.unlock();


}

lock.lock();


try {


condition.signal();


// 通知其他线程


} finally {


lock.unlock();


}


2.4 CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程完成操作。

java

CountDownLatch latch = new CountDownLatch(5);


for (int i = 0; i < 5; i++) {


new Thread(() -> {


System.out.println(Thread.currentThread().getName());


latch.countDown();


}).start();


}

latch.await();


3. 总结

本文介绍了Java并发包中5个常用类的使用技巧,包括线程池和锁。通过合理地使用这些类,可以有效地提高程序的性能和稳定性。在实际开发中,应根据具体需求选择合适的线程池和锁,以达到最佳的性能表现。