1、Semaphore
信号灯。。。。通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(3);
for(int i=1;i<=10;i++){
Runnable r = new Runnable() {
public void run() {
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() +
"进入,当前已有" + (3-semaphore.availablePermits()) + "个并发");
try {
Thread.sleep((long)(Math.random()*10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() +
"即将离开");
semaphore.release();
System.out.println("线程" + Thread.currentThread().getName() +
"已离开,当前已有" + (3-semaphore.availablePermits()) + "个并发");
}
};
threadPool.execute(r);
}
}
}
2、CyclicBarrier
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable(){
public void run(){
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
3、CountDownLatch
在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
public class CountdownLatchTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CountDownLatch cdOrder = new CountDownLatch(1);
final CountDownLatch cdAnswer = new CountDownLatch(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable(){
public void run(){
try {
System.out.println("线程" + Thread.currentThread().getName() +
"正准备接受命令");
cdOrder.await();
System.out.println("线程" + Thread.currentThread().getName() +
"已接受命令");
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"回应命令处理结果");
cdAnswer.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将发布命令");
cdOrder.countDown();
System.out.println("线程" + Thread.currentThread().getName() +
"已发送命令,正在等待结果");
cdAnswer.await();
System.out.println("线程" + Thread.currentThread().getName() +
"已收到所有响应结果");
} catch (Exception e) {
e.printStackTrace();
}
service.shutdown();
}
}
分享到:
相关推荐
Java并发工具类是Java并发编程中的重要组成部分,其中包括了多种实用的工具,如CountDownLatch、Semaphore和Exchanger,这些工具类极大地简化了多线程环境下的同步和协调问题。 1. **CountDownLatch**: ...
本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...
Java 并发工具类详解 Java 并发工具类是 Java 并发编程中的一种重要工具,用于协调线程之间的并发执行。 Java 并发工具类中有很多种,今天我们主要介绍四种:CyclicBarrier、CountDownLatch、Semaphore 和 ...
"Java 并发工具类详解" Java 并发工具类是 Java 并发编程的核心组件之一,提供了多种同步结构和并发容器,帮助开发者创建高效、可靠的并发程序。本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、...
#### 三、Java并发工具类 ##### 3.1 原子类 Java并发工具包中提供了原子类,如AtomicInteger、AtomicLong等,它们可以实现对整型或长整型变量的原子操作,无需显式加锁即可保证线程安全。 ##### 3.2 阻塞队列 阻塞...
九、并发工具类 包括 TimeUnit、ThreadLocalRandom 和 Phaser 等,这些工具类提供了在并发编程中常用的实用功能,如时间单位转换、随机数生成和同步阶段控制。 总结来说,Java并发工具包提供了丰富的工具和机制,...
接着,书中将深入探讨Java并发工具类,如Executor框架、Semaphore信号量、CyclicBarrier和CountDownLatch等,这些工具在实际项目中有着广泛的应用,学习它们能帮助开发者更好地控制和协调并发任务。 此外,书中的...
#### 四、Java并发工具类 Java并发编程中常用的一些工具类,这些工具类提供了更高级别的并发功能。 ##### 4.1 Executor框架 - **ExecutorService**:一个高级的线程池接口,提供了一系列的线程管理和任务执行方法。...
Java并发工具类LongAdder原理实例解析 Java并发工具类LongAdder是Java 8中引入的一种高性能的并发工具类,用于解决高并发情况下的计数器更新问题。LongAdder的出现是为了解决AtomicLong在高并发情况下的性能问题。...
在Android开发中,Java并发工具类库扮演着重要的角色,特别是在多线程和异步处理的场景下。这个名为“Xiaofei-it-Concurrent-Utils-829a450”的压缩包可能包含了一些优化和扩展了Java标准并发库(java.util....
Java并发工具类扩展了基本的并发功能,例如CountDownLatch、CyclicBarrier、Semaphore和Phaser提供了不同场景下的同步支持。Exchanger用于两个线程之间交换数据。 12. 硬件和操作系统支持 Java并发编程的成功在很大...
#### 1.2 Java并发工具类 - **Thread类**:Java中创建线程的基本方式,通过继承Thread类或实现Runnable接口来创建线程。 - **Executor框架**:提供了一种更灵活的方式来管理线程,包括ThreadPoolExecutor等类。 - **...
#### 八、Java并发工具类详解 第八章关注于Java提供的并发工具类,这些工具类包括CountDownLatch、CyclicBarrier、Semaphore等,它们是Java并发编程库的重要组成部分。本章不仅详细介绍了这些工具类的功能和用途,...
最后,Java并发工具类,如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门闩)和Exchanger(交换器),提供了更高级的同步和协调机制,有助于解决复杂并发场景的问题。 通过阅读《JAVA...
4. **并发工具类**:深入剖析了Java并发工具类的实现原理,如ConcurrentHashMap、LinkedBlockingQueue、ConcurrentSkipListMap等,并提供了实际应用示例。 5. **线程池**:详细解析了Executor框架,包括线程池的...
下面将详细探讨Java并发工具包中的主要类和接口,以及它们在并发编程中的作用。 1. **Executor框架**:Java并发工具包的核心是Executor框架,它基于`java.util.concurrent.Executor`接口。Executor接口定义了一个...
### Java并发工具类 #### 1. 线程安全类 - **Vector**:早期的线程安全集合。 - **HashTable**:线程安全的Map实现。 - **ConcurrentHashMap**:高效的线程安全Map。 - **CopyOnWriteArrayList**:写时复制策略实现...
此外,书中还深入讨论了Java并发工具类,如ExecutorService、Future、BlockingQueue、Semaphore等。这些工具是构建并发程序的重要组件,了解它们的特性和使用场景,能够帮助开发者更好地组织并发任务,优化系统资源...
Java并发工具类是Java多线程编程中必不可少的一部分,它们为开发者提供了更加高效和灵活的线程同步机制。本文将详细介绍三个重要的并发工具类:CountDownLatch、CyclicBarrier和Semaphore。 首先,CountDownLatch是...