java

位置:IT落伍者 >> java >> 浏览文章

Java编程技巧(信号量,管道)


发布日期:2023年07月15日
 
Java编程技巧(信号量,管道)

信号量  

在进行多线程编程时经常要使用同步互斥机构但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原语,用于唤醒线程恢复运行。tW.WInGwiT.cOM由于这两个方法定义为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实现zip压缩/解压缩(1)

下一篇:Java语法规则