xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、信号量
在进行多线程编程时,经常要使用同步互斥机构,但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 Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器