JDK5的concurrent包里面尽是宝贝,还好我有的是时间,正好可以一一八来。
以前用多线程处理 生产者-消费者 问题的时候,需要采用wait,notify, 现在有了这些阻塞队列,就可以把这些wait,notify抛一边,轻易的就能解决问题。
首先是SynchronousQueue,这个队列里面只能放一个对象,在没有被take之前,所有的add都会被阻塞,反之,如果队列里面没有对象,那么所有的take也都会被阻塞。
下面代码中的SynchronousQueue,可以替换成ArrayBlockingQueue, 和LinkedBlockingQueue。
ArrayBlockingQueue是一个定长的阻塞队列,
LinkedBlockingQueue则是不定长度,可以指定,也可以不指定,不指定的话其最大值可以为Integer.MAX_VALUE
//public BlockingQueue<Integer> bq=new SynchronousQueue<Integer>();
//public BlockingQueue<Integer> bq=new ArrayBlockingQueue<Integer>(5);
public BlockingQueue<Integer> bq=new LinkedBlockingQueue<Integer>();
int i=0;
class Producer implements Runnable{
public void run(){
while(true){
try {
bq.put(i);
System.out.println("size="+bq.size());
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//bq.add(i);
i++;
try {
TimeUnit.MILLISECONDS.sleep(500l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
public void run(){
while(true){
try {
System.out.println(bq.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
TimeUnit.MILLISECONDS.sleep(1000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void testBlockingQueue(){
ExecutorService se=Executors.newCachedThreadPool();
se.execute(new Producer());
se.execute(new Consumer());
}
分享到:
相关推荐
`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,它的主要特性是元素只有在达到指定延迟时间后才能被消费。这种队列常用于实现定时任务调度、缓存过期策略等场景。 1. **延迟元素的概念** ...
ArrayBlockingQueue是基于jdk1.8进行分析的阻塞队列实现。阻塞队列是一个传统的有界队列,在这个有界队列里,一个固定大小的数组用来保存生产者产生的元素和消费者获取的元素。一旦创建,大小不可改变。往已满的队列...
JDK 1.4引入了NIO(非阻塞I/O),为Java提供了更高性能和更灵活的I/O操作方式。NIO允许应用程序在处理I/O事件时避免阻塞,提高了并发处理能力,特别适用于高并发网络应用。主要类包括`java.nio.channels`包下的`...
2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...
阻塞队列是一种特殊类型的队列,它在队列为空时会阻塞获取元素的线程,而在队列满时会阻塞插入元素的线程。这简化了生产者-消费者模型的实现,因为线程间的同步问题已经被内建在队列中。常见的实现包括 `...
7. **NIO (New Input/Output)**:`java.nio`包提供了非阻塞I/O,适用于高并发、低延迟的系统。 8. **Lambda表达式**:Java 8引入的重要特性,简化了函数式编程,使得匿名函数的编写更加简洁。 9. **日期和时间API*...
综上所述,这个压缩文件为Java开发者提供了中文版的JDK1.6和J2EE5 API文档,是学习和开发过程中不可或缺的参考资料。通过深入学习这些API,开发者可以更好地掌握Java编程语言以及构建企业级应用的技术。
JDK 提供的几种阻塞队列实现: 1. ArrayBlockingQueue:基于数组的有界阻塞队列,线程安全,遵循先进先出(FIFO)原则,可以通过构造函数设置容量。 2. LinkedBlockingQueue:基于链表的有界阻塞队列,默认无大小...
### JDK_AQS解析 #### 概述 在Java并发编程中,`AbstractQueuedSynchronizer`(简称AQS)是实现锁和其他同步工具的基础框架。AQS位于`java.util.concurrent`包下,通过模板方法设计模式实现了锁的底层机制。本文将...
在Java的并发编程中,JDK提供的容器类库扮演了重要角色,其中`java.util.concurrent`包下的`BlockingQueue`接口及其实现类是多线程环境下数据同步的重要工具。本篇文章将深入探讨`LinkedBlockingQueue`,这是一个...
在处理支付请求时,可以利用ActiveMQ等消息队列进行异步处理,避免因支付请求过多导致的系统阻塞。 12. **Jvm调优** 对于Java应用,理解并优化JVM的配置至关重要。监控垃圾回收、内存分配、线程状态等,可以帮助...
4. **NIO.2**:JDK 1.6引入了NIO.2,即新的非阻塞I/O模型,提供了更好的文件系统访问和异步I/O操作,提升了I/O性能。 5. **改进的异常处理**:引入了`try-with-resources`语句,可以自动关闭在`try`块中打开的资源...
2. **java.util**: 提供了集合框架,包括List、Set、Map等接口及其实现类,还有日期时间处理、事件模型、队列、堆栈等工具类。 3. **java.io**: 实现输入/输出操作,包括文件读写、数据流、序列化等。 4. **java...
10. **并发改进**:JDK 5.0引入了`java.util.concurrent`包,提供了高级并发工具,如线程池、阻塞队列、同步器等,使得多线程编程更加高效和易于管理。 这些只是JDK 5.0中部分重要的新特性。通过深入学习《良葛格...
JDK 提供的这些容器大部分在 `java.util.concurrent` 包中。 - **`ConcurrentHashMap`** : 线程安全的 `HashMap` - **`CopyOnWriteArrayList`** : 线程安全的 `List`,在读多写少的场合性能非常好,远远好于 `...
- **JMS(Java Message Service)**:加强了对消息传递的API支持,提供了更强大的消息队列功能。 - **JPA(Java Persistence API)**:引入了对对象关系映射(ORM)的支持,简化了数据库操作。 6. **调试和诊断**...
- **执行队列管理**:创建新执行队列有助于优先处理核心业务,避免阻塞和死锁。新队列应设置合适的优先级,并为应用程序组件分配策略,如在web.xml中配置`wl-dispatch-policy`。 - **连接参数调整**:增大Accept ...