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

2016-02-19 12:43 9 1 收藏

下面是个超简单的Java编程技巧(信号量,管道)教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

       一、信号量
  
  在进行多线程编程时,经常要使用同步互斥机构,但Java本身没有提供的同步互斥机构,仅提供了两个与同步互斥有关的方法:wait()和notify(),可以用来设计信号量类:mySemaphore,它是按照Dijkstra提出的计数信号量的思想设计的。
  
  mySemaphore有两个最重要的成员方法:P()和V()。这两个方法实际就实现了信号量的P操作和V操作。具体描述如下:
  
  public synchronized void P(){
  
  semaphore--;
  
  if(semaphore0){
  
  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;
  } 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1601662.html

延伸阅读
[文章导读]显示文字是Java中最基本的功能,使用非常简单的方式来支持文字的显示 显示文字是Java中最基本的功能,使用非常简单的方式来支持文字的显示,只要使用类Graphics中的drawString()函数就能实现。我们来看最简单的ghq例子: //ghq.java import java.awt.*; import java.applet.*; public class ghq extends Applet { String te...
Example 1 Below is a simple Java program which can get the hostname of a computer from IP address. download now Tips 1. Compile: javac GetHost 2. Run: java GetHost 111.111.111.1(your IP or others) import java.io.*; import java.net.*; // // // GetHost.java // // public class GetHost { public static void ...
我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切! 真是神奇!Java是如何做到这一点的?通过类!作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个...
    摘要: 本文主要对匿名管道这种网络通信技术进行了介绍,并对其VC++的实现方法作了介绍。     关键词: 管道;匿名管道;Visual C++ 1 概述 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另...
qq飞车手游老街管道怎么跑 在游戏中,老街管道这个赛道还是比较简单的,玩家只要熟悉了地图,再加上一定的游戏技巧,轻松到达终点还是没有任何问题的,下面说说老街管道中的过弯技巧,希望能够帮到你。 第一个弯道,这个弯道呈“L”形,过起来比较简单,只要来一个甩尾漂移就可以轻松过去。需要注意的是,这个弯道在开局的时候容易发生拥堵导...

经验教程

729

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部