案例1:
package cn.crxy.synchronizer; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; // 和CountDownLatch类似 但是使用场景不同, CountDownLatch用于 组和组线程之间等待 CyclicBarrierDemo用于同组内线程相互等待 public class CyclicBarrierDemo { public static void main(String[] args) { final CyclicBarrier cb = new CyclicBarrier(4); for (int i = 0; i < 4; i++) { new Thread(new Runnable() { @Override public void run() { try { System.out.println(Thread.currentThread().getName()+" :爬山。。。"); TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1); System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。"); cb.await();//等待,直到计数器变为0为止 System.out.println(Thread.currentThread().getName()+" :吃饭。。。"); TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1); System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。"); cb.await();//等待,直到计数器变为0为止 System.out.println(Thread.currentThread().getName()+" :KTV。。。"); TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1); System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。"); cb.await();//等待,直到计数器变为0为止 System.out.println(Thread.currentThread().getName()+":回家"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }).start(); } } }
案例2:
package cn.itcast.heima2; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 场景: 各自家出发到公司,会和后各自去公园,都达到公园会和后,在去A饭店吃饭 * * * @author zm * */ 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()*1000)); System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候")); cb.await(); Thread.sleep((long)(Math.random()*1000)); System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候")); cb.await(); Thread.sleep((long)(Math.random()*1000)); 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(); } }
相关推荐
java.util.concurrent包提供了Semaphore、CyclicBarrier、CountDownLatch等工具,为更复杂的线程同步场景提供解决方案。 线程状态是理解线程行为的关键。Java线程有五种基本状态:新建、就绪、运行、阻塞和终止。...
`java.util.concurrent`包中增加了一些新的工具类,如`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些类有助于协调多线程间的同步。 8. **并发编程的`LinkedBlockingQueue`改进** 对`LinkedBlockingQueue`...
此外,JDK 5.0还改进了内存模型,支持了线程并发的更多原语,如`java.util.concurrent`包中的`Executor`和`Future`接口,以及`CyclicBarrier`、`Semaphore`等同步工具类。这些特性为编写高效的多线程程序提供了便利...
- **并发工具类**:在JDK 1.5之前,书中介绍了Semaphore、Barrier等并发工具,它们用于控制对共享资源的访问。 - **死锁、活锁和饥饿**:讨论了并发编程中可能出现的这些问题及其避免方法。 - **线程安全的数据...
16.4.3 线程同步调度的方法 362 16.4.4 “生产者-消费者”案例的框架 362 16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 ...
理解线程的生命周期、同步机制(如synchronized关键字、Lock接口及其实现)、并发工具类(如Semaphore、CyclicBarrier、CountDownLatch)等,能帮助开发者编写出高效且线程安全的代码。特别关注线程间的通信(如wait...
`CyclicBarrier`也是一个同步辅助类,它允许一组线程互相等待,直到达到某个公共的屏障点。与`CountDownLatch`不同的是,`CyclicBarrier`可以在所有线程都到达屏障点后重置屏障,以便再次使用。 **2.4.3 `Semaphore...
3. **并发工具类**:介绍了许多高级并发工具,如Executor框架、Semaphore信号量、CyclicBarrier屏障、CountDownLatch倒计时器、Phaser同步阶段以及Future和Callable接口,这些工具提供了更加灵活和强大的并发控制...
3. **CyclicBarrier和Semaphore**:这两个同步工具类在1.5版本之后被广泛使用,但在早期的`concurrent-1.3.2.jar`中已经存在。`CyclicBarrier`用于让一组线程等待彼此到达一个共同的屏障点,而`Semaphore`则用于控制...
- **Phaser**:是一种可以替代CountDownLatch或CyclicBarrier的同步辅助类。 - **TransferQueue**:是一种特殊的队列实现,它可以将元素传递给等待的消费者线程。 - **应用场景**:在低线程池大小的情况下,优先...
10. **多线程**:线程的创建方式(Thread类和Runnable接口),线程同步机制(synchronized关键字、wait/notify等)。 11. **接口与抽象类**:接口的定义与实现,抽象类的概念和使用场景。 12. **Java Swing和JavaFX*...
9. **多线程**:介绍了线程的基本概念,如何创建和管理线程,以及同步机制(如synchronized关键字和wait/notify机制)。 **下册——Java语言程序设计-进阶篇(原书第8版)** 进阶篇则更侧重于高级主题和技术,包括...
最后,线程的使用也是这一章的重点,包括同步机制(synchronized关键字,wait()和notify()方法)和并发工具类(如Semaphore, CyclicBarrier)。 此外,资料中可能还会涉及Java的三大框架——Spring、MyBatis和...
3. **多线程**:学习线程的创建与管理,同步机制,死锁问题。 4. **网络编程**:通过Socket编程实现客户端和服务器通信。 5. **反射**:理解反射机制,如何在运行时动态访问类和对象。 6. **JNI(Java Native ...
1. **多线程**:探讨线程的创建、同步、通信,以及死锁和线程池。 2. **并发编程**:讲解并发工具类,如Semaphore、CountDownLatch、CyclicBarrier和ExecutorService。 3. **文件系统与NIO**:介绍Java NIO(New ...
并发工具类如CountDownLatch、CyclicBarrier、Semaphore、Phaser等也被广泛使用。 ### 反射 Java反射机制允许程序在运行时访问和操作类、方法、接口等。通过反射,可以检查、修改和创建类的行为。常见的反射类包括...
- **并发工具类**:CountDownLatch、CyclicBarrier、Semaphore等的使用场景和案例分析。 - **原子操作**:AtomicInteger等类的使用方法。 ##### 3. 设计模式 - **单例模式**:懒汉式、饿汉式、静态内部类方式的实现...
- **同步机制**:synchronized关键字实现线程同步,防止数据不一致。 - **并发工具类**:如Semaphore、CyclicBarrier、CountDownLatch等,提供更灵活的线程协作方式。 6. **I/O流** - **流的分类**:按照流向...