线程类Thread的API接口分析系列之管道通讯Piped

Java对于多线程之间的通信提供了一个机制,管道,虽然说线程之间完全可以通过共享变量进行通信,但是java提供了这么一个机制也是应该了解下的,毕竟专门提供的机制肯定有它的好处。由于相对简单(估计内部其实也是用了线程之间的共享变量之类的)就没必要分析什么了,直接上例子

对于字节流:PipedInputStream和PipedOutputStream

public class ThreadApiTest implementsRunnable {

 

         privateString type;

         privateObject obj;

        

         ThreadApiTest(Objectobj){

                   this.obj=obj;

         }

         /**

         *多线程相关api测试

         *@author : zhengrf1

          * @throws InterruptedException

         *@date 创建时间:2017年3月7日下午4:43:15

         */

         publicstatic void main(String[] args) throws InterruptedException {

                   //TODO Auto-generated method stub

                   PipedInputStreamin = new PipedInputStream();

                 PipedOutputStream out = newPipedOutputStream();

                   ThreadApiTestinThread = new ThreadApiTest(in);

                   ThreadApiTestoutThread = new ThreadApiTest(out);

                   inThread.type="read";

                   outThread.type="write";

                   Threadintest = new Thread(inThread);

                   Threadouttest = new Thread(outThread);

                   try{

                            in.connect(out);

                   }catch (IOException e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }

 

                   outtest.start();

                   Thread.sleep(1000);

                   intest.start();

         }

 

         /*@author : zhengrf1

          * @date 创建时间:2017年3月7日 下午4:46:48

          * @see java.lang.Runnable#run()

          */

         @Override

         publicvoid run() {

                   //TODO Auto-generated method stub

                   if(type.equals("write")){

                            write();

                   }

                   else{

                            read();

                   }

         }

        

         publicvoid write(){

                   PipedOutputStreamin = (PipedOutputStream)obj;

                   try{

                            out.write("hello".getBytes());

                   }catch (IOException e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }

         }

        

         publicvoid read(){

                   PipedInputStreamin = (PipedInputStream)obj;

                   try{

                            byte[]b = new byte[50];

                            System.out.println(in.read(b));

                            Strings = new String(b,"utf-8");

                            System.out.println(s);

                   }catch (IOException e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }

         }

}

 

对于字符流:PipedReader和PipedWriter

public classThreadApiTest implements Runnable {

 

    private String type;

    private Object obj;

   

    ThreadApiTest(Objectobj){

        this.obj=obj;

    }

    /**

    *多线程相关api测试

    *@author : zhengrf1

     * @throws InterruptedException

    *@date创建时间:201737下午4:43:15

    */

    public static void main(String[] args) throws InterruptedException {

        // TODO Auto-generated method stub

//      PipedInputStreamin = new PipedInputStream();

//      PipedOutputStreamout = new PipedOutputStream();

        PipedReaderin = new PipedReader();

        PipedWriterout= newPipedWriter();

        ThreadApiTestinThread= newThreadApiTest(in);

        ThreadApiTestoutThread= newThreadApiTest(out);

        inThread.type="read";

        outThread.type="write";

        Threadintest= newThread(inThread);

        Threadouttest= newThread(outThread);

        try {

            in.connect(out);

        }catch(IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

        outtest.start();

        Thread.sleep(1000);

        intest.start();

    }

 

    /* @author : zhengrf1

     * @date 创建时间:201737下午4:46:48

     * @see java.lang.Runnable#run()

     */

    @Override

    public void run() {

        // TODO Auto-generated method stub

//      while(true){

//          System.out.println(Thread.currentThread().getName()+"isalive!");

//          System.out.println(this.hashCode());

//          synchronized(this){

//          Thread.currentThread().isAlive();

                Thread.sleep(100000);

//          }

//      }

        if(type.equals("write")){

            write();

        }

        else{

            read();

        }

    }

   

    public void write(){

        PipedWriterout= (PipedWriter)obj;

        try {

            out.write("hello");

        }catch(IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

   

    public void read(){

        PipedReaderin = (PipedReader)obj;

        try {

//          byte[]b = new byte[50];

            char[] b = new char[50];

            System.out.println(in.read(b));

            Strings = new String(b);

            System.out.println(s);

        }catch(IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

 

--值得注意的是,在java中父类转子类的形式是

PipedWriter out = (PipedWriter)obj;

然后再用out.write去操作

而不是像C++那样强制转换就能使用(PipedWriter)obj.write

另外一个知识点是byte[]String的方法不能直接

byte[].toString();//这个实际只是上帝类的toString,里面是类名加哈希值

而是使用String的构造方法创建出String对象String s = newString(b,"utf-8");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值