Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1562995
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:32:24

一起学习
一、信号量 在进行多线程编程时,经常要使用同步互斥机构,但java本身没有提供的同步互斥机构,仅提供了两个与同步互斥有关的方法:wait()和notify(),可以用来设计信号量类:mySemaphore,它是按照Dijkstra提出的计数信号量的思想设计的。 mySemaphore有两个最重要的成员方法:P()和V()。这两个方法实际就实现了信号量的P操作和V操作。具体描述如下: public synchronized void P(){ semaphore--; if(semaphore<0){ try{ wait(); }catch(InterruptedException ie){} } } public synchronized void V(){ semaphore ; if(semaphore<=0) notify(); } 其中,semaphore变量记录了信号量的状态,wait()方法相当于block原语,用于阻塞线程的执行,notify()方法相当于wakeup原语,用于唤醒线程恢复运行。由于这两个方法定义为synchronized,这样java虚拟机可保证这两个方法的原子执行,从而实现了P、V操作。 二、管道 并发程序的多个线程之间的通讯通常是使用管道进行,jdk提供了两个管道类:PipedInpuStream和PipedOutputStream,前者用于输入,后者用于输出。这两种管道应该是能够多次连接和关闭,在实现过程中,却发现它们在关闭后,不能重新建立连接。经过仔细调试后,发现jdk的源代码在处理关闭时释放资源存在着缺陷,因此需要编写自己的管道类:MyPipedInputStream和MyPipedOutputStream。这两个类直接从InputStream和OutputStream继承而来,其成员方法与实现基本与PipedInputStream和PipedOutputStream一致,只是在处理关闭时,将类中的成员变量的值恢复成未连接时的初始值。另外,原有的管道了提供的管道容量只有1024个字节,在传输数据量较大时,可能会发生溢出,而在自己的管道类中可以任意设置管道容量,例如可以根据需要把管道容量设为64KB。以下仅给出了相应的关闭例程: 1.MyPipedInputStream public void close() throws IOException { in = -1; out = 0; closedByReader = true; connected = false; closed = true; buffer = new byte[PIPE_SIZE]; } 2.MyPipedOutputStream public void close() throws IOException { if (sink != null) { sink.receivedLast(); sink.closed = true; } sink = null; connected = false; } 下载本文示例代码


Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)Java编程技巧(信号量,管道)
阅读(102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~