服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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原语,用于唤醒线程恢复运行。由于这两个方法定义为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;
}

扫描关注微信公众号