`

使用Condition实现多路等待通知

    博客分类:
  • J2SE
阅读更多

一个锁内部可以有多个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();
     }
   } 
 }
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    线程池epoll多路复用服务器c++

    标题中的“线程池epoll多路复用服务器c++”是一个高级的计算机网络编程概念,涉及到C++语言实现的服务器架构。这个架构利用了线程池和epoll(I/O多路复用)技术来提高服务器处理并发连接的能力。下面我们将详细探讨...

    IO多路复用之epoll实例

    在Linux系统中,epoll是实现IO多路复用的一种高效方法,它克服了早期的poll和select方法在处理大量并发连接时性能下降的问题。 epoll的核心概念包括: 1. **Epoll结构**:epoll_create()函数创建一个epoll实例,...

    backport-util-concurrent(2.2 /3.1)

    与synchronized不同,ReentrantLock支持公平锁和非公平锁策略,并且可以分离条件变量,这使得多路分支等待成为可能。 - Condition接口提供了等待/通知机制,允许更精确的线程同步。每个Lock实例可以有多个Condition...

    linux类IOCP接口

    Epoll 是 Linux 提供的一种 I/O 多路复用技术,它极大地提高了在大量连接并发时的处理能力。Epoll 的核心思想是事件驱动,它允许程序注册感兴趣的 I/O 事件,并在这些事件发生时通过回调函数或轮询方式通知程序。...

    epoll回射服务器

    1. **I/O多路复用**:在多线程或多进程环境下,允许程序同时等待多个I/O事件,而不是依次等待,提高了系统处理并发请求的能力。 2. **epoll接口**:Linux内核提供的高效I/O事件通知机制,它支持水平触发(LT)和...

    Linux C epoll.zip_Linux下线程池_c epoll_epoll C++_epoll 线程池_linux c

    2. **Epoll(Event Poll)**:Epoll是Linux内核提供的一种I/O多路复用技术,相较于传统的select和poll,Epoll更高效,支持水平触发和边缘触发两种模式,并且能够有效地解决大量文件描述符的问题。Epoll的优势在于其...

    linux下多线程读写socket的简单例子

    4. **选择器/epoll**:在多线程环境中,可以使用select、poll或epoll等I/O多路复用技术来监控多个Socket,当某个Socket有数据可读或可写时,通知相应的线程进行处理。epoll提供更高的性能和可扩展性,尤其适合大并发...

    高性能服务器开发文档.rar

    本文将基于“高性能服务器开发文档.rar”中的内容,深入探讨几个关键知识点:内存拷贝、同步机制和多路事件分离API。 首先,我们来看内存拷贝。在服务器编程中,数据的快速传输与处理是提升性能的关键。传统的内存...

    基于Python的操作系统课程设计

    Python可以模拟这种行为,例如使用`time.sleep()`模拟CPU空闲,或者使用`select`或`selectors`模块来实现I/O多路复用。 通过这样的课程设计,学生不仅能学习到操作系统的基本原理,还能掌握Python在并发编程和系统...

    计算机网络应用程序-客户端与服务器管程通信

    这种模型称为多路复用(Multiplexing),在实际应用中,可以通过多线程、多进程或异步I/O等方式实现。 管程,是操作系统中的一种同步原语,由Dijkstra提出,用于解决多个线程访问共享资源时的并发控制问题。在...

    输入输出队列-LinuxC

    6. **异步I/O**:Linux提供了`aio`(Asynchronous I/O)库,允许程序在I/O操作完成时得到通知,而不是阻塞等待。这对于需要同时处理多个I/O事件的应用程序非常有用。 7. **非阻塞I/O**:`fcntl`函数可以设置文件...

    linux系统编程

    10. 高级I/O功能:对非阻塞I/O、异步I/O以及IO多路复用(如select(), poll(), epoll())的理解和运用,这些技术在处理大量文件描述符时尤其重要。 11. 调试与优化:在Linux环境下进行系统编程时,如何调试程序以及...

    UNIX环境高级编程第二版

    - **多路转接技术**:如select()、poll()、epoll()等,用于高效地处理大量并发连接。 #### 三、实践应用案例 - **案例1:FTP服务器开发** - 使用socket编程实现客户端与服务器之间的文件传输功能。 - 应用多线程...

    linux系统编程及网络编程笔记

    网络编程中,多路复用技术如select、poll和epoll是提高服务器并发性能的有效工具。它们允许程序同时监视多个套接字,一旦有数据可读或可写,就通知程序进行处理,提高了资源利用率。同时,非阻塞I/O模式也是提升效率...

    通过实际例子来学习和练习Go并发模式,提供了测试用例来验证您的答案.zip

    5. **Select**:`select`语句允许goroutine等待多个channel操作,类似于多路复用。当有多个channel可供操作时,`select`将随机选择一个非阻塞的操作执行。 6. **Close Channel**:关闭channel可以通知其他goroutine...

    Linux高级编程课件

    同时,select()和poll()提供I/O多路复用机制,使得程序可以同时处理多个套接字。 五、多线程与同步 Linux支持POSIX线程(pthreads),通过pthread_create()创建线程,pthread_join()等待线程结束。线程同步有多种...

    linux系统编程 中文版

    此外,还可能涉及套接字选项、多路复用I/O(select、poll、epoll)等高级主题。 6. **信号处理**:信号是Linux系统中一种异步事件通知机制,书中会讲述信号的发送、接收、屏蔽以及自定义信号处理函数的设定。 7. *...

Global site tag (gtag.js) - Google Analytics