黑马程序员技术交流社区

标题: 管道通信(PipedInputStream)与进程通信中的Synchron同步有什么区别? [打印本页]

作者: pzfpang449    时间: 2013-2-8 17:35
标题: 管道通信(PipedInputStream)与进程通信中的Synchron同步有什么区别?
问题:
管道通信(PipedInputStream和PipedOutputStream)与进程通信中的write()和notify()的Synchronized同步有什么区别?
解答:
管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
主要分为一下步骤:

首先建立管道流,并将管道流的输入输出对象进行链接;

将管道流加入到生产对象(线程)中;

通过管道流引出输入输出流,并在线程中对这些流进行操作;

注:管道流的的read的方法是一种阻塞方法;



public class CommunicateWhitPiping {
    public static void main(String[] args) {
        /**
         * 创建管道输出流
         */
        PipedOutputStream pos = new PipedOutputStream();
        /**
         * 创建管道输入流
         */
        PipedInputStream pis = new PipedInputStream();
        try {
            /**
             * 将管道输入流与输出流连接 此过程也可通过重载的构造函数来实现
             */
            pos.connect(pis);
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         * 创建生产者线程
         */
        Producer p = new Producer(pos);
        /**
         * 创建消费者线程
         */
        Consumer c = new Consumer(pis);
        /**
         * 启动线程
         */
        p.start();
        c.start();
    }
}

/**
* 生产者线程(与一个管道输入流相关联)
*
*/
class Producer extends Thread {
    private PipedOutputStream pos;

    public Producer(PipedOutputStream pos) {
        this.pos = pos;
    }

    public void run() {
        int i = 8;
        try {
            pos.write(i);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
* 消费者线程(与一个管道输入流相关联)
*
*/
class Consumer extends Thread {
    private PipedInputStream pis;

    public Consumer(PipedInputStream pis) {
        this.pis = pis;
    }

    public void run() {
        try {
            System.out.println(pis.read());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

希望对大家有所帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2