- 浏览: 515642 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (268)
- C/C++ (5)
- LUA (0)
- JVM (6)
- UML (1)
- J2SE (43)
- J2EE (15)
- EXTJS (1)
- HTML5 (47)
- ANDROID (2)
- JAVASCRIPT (51)
- WEB SERVICES (0)
- 数据库 (2)
- 数据结构 (0)
- 应用服务器 (11)
- 设计模式应用 (0)
- JAVA性能与缓存 (1)
- ByteCode (5)
- RCP (0)
- Plugin (0)
- Eclipse (3)
- 程序人生 (14)
- Mobile (2)
- Linux/Ubuntu (31)
- sublime (2)
- python (15)
- Git (5)
- NodeJs (3)
- Crosswalk (1)
- Browserify (1)
- Backbone (1)
最新评论
一个锁内部可以有多个Condition,即有多路等待和通知,可参考JDK1.5的Lock和Condition实现的可阻塞队列的应用案例,在传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象.
使用Condition可简单实现多路等待通知
public class TwoConditionCommunication { public static void main(String[] args) { final Business business = new Business(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 50; i++) { business.sub(i); } } }).start(); for (int i = 1; i <= 50; i++) { business.main(i); } } static class Business { Lock lock = new ReentrantLock(); Condition condition_sub = lock.newCondition(); Condition condition_main = lock.newCondition(); private boolean shouldSub = true; public void sub(int i) { lock.lock(); try { while (!shouldSub) { try { condition_sub.await(); } catch (Exception e) { e.printStackTrace(); } } for (int j = 1; j <= 10; j++) { System.out.println("sub2 thread sequence of " + j + ",loop of " + i); } shouldSub = false; condition_main.signal(); } finally { lock.unlock(); } } public void main(int i) { lock.lock(); try { while (shouldSub) { try { condition_main.await(); } catch (Exception e) { e.printStackTrace(); } } for (int j = 1; j <= 20; j++) { System.out.println("main thread sequence of " + j + ",loop of " + i); } shouldSub = true; condition_sub.signal(); } finally { lock.unlock(); } } } }
附JDK1.5中Demo
class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); return x; } finally { lock.unlock(); } } }
发表评论
文章已被作者锁定,不允许评论。
-
关于Thread.IsAlive属性
2015-07-04 12:12 882今天在讨论多线程的时候,谈到了这个属性。IsAlive,顾名 ... -
Java:对象的强、软、弱和虚引用
2015-02-28 11:00 731文章源自:http://zhangjunhd.blog.51 ... -
一个通用并发对象池的实现
2015-01-20 09:32 733Source: http://ifeve.com/gener ... -
如何创建不可变的Java类或对象
2015-01-07 16:29 2183在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过 ... -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
2014-12-29 11:49 803文章源自:http://www.cnblogs.com/li ... -
中断线程深入
2014-12-25 15:18 795本文转自http://jiangzhengjun.itey ... -
深入java.lang.ThreadLocal类
2014-12-24 16:50 707文章源自:http://lavasoft.blog.51c ... -
Java 8新特性探究(3):解开lambda最强作用的神秘面纱
2014-07-10 17:50 710文章源自:http://developer.51cto.co ... -
Java 8特性探究(2):深入解析默认方法
2014-07-08 11:12 782文章源自:http://develop ... -
Java 8特性探究(1):通往lambda之路_语法篇
2014-07-08 09:59 690文章源自:http://developer.51cto.c ... -
java文件复制方法参考
2013-12-02 14:17 730最快的文件复制方法 private static ... -
用Java数字签名提供XML安全
2013-11-29 16:11 13134文章源自:http://www. ... -
深入理解HashMap的工作原理
2013-11-18 15:49 823HashMap的工作原理是近 ... -
JDBC4.0 驱动加载过程
2013-01-16 10:09 3634注意,jdbc4.0不再需要显示调用class.fo ... -
Java自定义的类加载器
2013-01-15 08:38 1014一、类加载器类别 * 1.java虚拟机自带的加载器 ... -
使用Log4j生成不同日志级别的日志文件
2012-12-26 17:09 5331在src根目录下存放log4j.xml文件,具体配置如下(测试 ... -
深入理解HashMap
2012-12-13 10:08 865文章摘自:http://www.iteye.c ... -
java字节码加解密
2012-06-30 09:53 1096一.创建KEY class Key { ... -
java动态代理简单实现
2012-06-30 09:45 1026一.接口 public interface Foo { ... -
线程池简单实现
2012-06-25 11:42 1097其实线程池的实现就是生产者消费者问题 的实现,理解了生产者消 ...
相关推荐
标题中的“线程池epoll多路复用服务器c++”是一个高级的计算机网络编程概念,涉及到C++语言实现的服务器架构。这个架构利用了线程池和epoll(I/O多路复用)技术来提高服务器处理并发连接的能力。下面我们将详细探讨...
在Linux系统中,epoll是实现IO多路复用的一种高效方法,它克服了早期的poll和select方法在处理大量并发连接时性能下降的问题。 epoll的核心概念包括: 1. **Epoll结构**:epoll_create()函数创建一个epoll实例,...
与synchronized不同,ReentrantLock支持公平锁和非公平锁策略,并且可以分离条件变量,这使得多路分支等待成为可能。 - Condition接口提供了等待/通知机制,允许更精确的线程同步。每个Lock实例可以有多个Condition...
Epoll 是 Linux 提供的一种 I/O 多路复用技术,它极大地提高了在大量连接并发时的处理能力。Epoll 的核心思想是事件驱动,它允许程序注册感兴趣的 I/O 事件,并在这些事件发生时通过回调函数或轮询方式通知程序。...
1. **I/O多路复用**:在多线程或多进程环境下,允许程序同时等待多个I/O事件,而不是依次等待,提高了系统处理并发请求的能力。 2. **epoll接口**:Linux内核提供的高效I/O事件通知机制,它支持水平触发(LT)和...
2. **Epoll(Event Poll)**:Epoll是Linux内核提供的一种I/O多路复用技术,相较于传统的select和poll,Epoll更高效,支持水平触发和边缘触发两种模式,并且能够有效地解决大量文件描述符的问题。Epoll的优势在于其...
4. **选择器/epoll**:在多线程环境中,可以使用select、poll或epoll等I/O多路复用技术来监控多个Socket,当某个Socket有数据可读或可写时,通知相应的线程进行处理。epoll提供更高的性能和可扩展性,尤其适合大并发...
本文将基于“高性能服务器开发文档.rar”中的内容,深入探讨几个关键知识点:内存拷贝、同步机制和多路事件分离API。 首先,我们来看内存拷贝。在服务器编程中,数据的快速传输与处理是提升性能的关键。传统的内存...
Python可以模拟这种行为,例如使用`time.sleep()`模拟CPU空闲,或者使用`select`或`selectors`模块来实现I/O多路复用。 通过这样的课程设计,学生不仅能学习到操作系统的基本原理,还能掌握Python在并发编程和系统...
这种模型称为多路复用(Multiplexing),在实际应用中,可以通过多线程、多进程或异步I/O等方式实现。 管程,是操作系统中的一种同步原语,由Dijkstra提出,用于解决多个线程访问共享资源时的并发控制问题。在...
6. **异步I/O**:Linux提供了`aio`(Asynchronous I/O)库,允许程序在I/O操作完成时得到通知,而不是阻塞等待。这对于需要同时处理多个I/O事件的应用程序非常有用。 7. **非阻塞I/O**:`fcntl`函数可以设置文件...
10. 高级I/O功能:对非阻塞I/O、异步I/O以及IO多路复用(如select(), poll(), epoll())的理解和运用,这些技术在处理大量文件描述符时尤其重要。 11. 调试与优化:在Linux环境下进行系统编程时,如何调试程序以及...
- **多路转接技术**:如select()、poll()、epoll()等,用于高效地处理大量并发连接。 #### 三、实践应用案例 - **案例1:FTP服务器开发** - 使用socket编程实现客户端与服务器之间的文件传输功能。 - 应用多线程...
网络编程中,多路复用技术如select、poll和epoll是提高服务器并发性能的有效工具。它们允许程序同时监视多个套接字,一旦有数据可读或可写,就通知程序进行处理,提高了资源利用率。同时,非阻塞I/O模式也是提升效率...
5. **Select**:`select`语句允许goroutine等待多个channel操作,类似于多路复用。当有多个channel可供操作时,`select`将随机选择一个非阻塞的操作执行。 6. **Close Channel**:关闭channel可以通知其他goroutine...
同时,select()和poll()提供I/O多路复用机制,使得程序可以同时处理多个套接字。 五、多线程与同步 Linux支持POSIX线程(pthreads),通过pthread_create()创建线程,pthread_join()等待线程结束。线程同步有多种...
此外,还可能涉及套接字选项、多路复用I/O(select、poll、epoll)等高级主题。 6. **信号处理**:信号是Linux系统中一种异步事件通知机制,书中会讲述信号的发送、接收、屏蔽以及自定义信号处理函数的设定。 7. *...