zoukankan      html  css  js  c++  java
  • java多线程之管道流

    java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。

    一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道,实现不同线程间的通信,而无需借助于临时文件之类的东西。

    在java jdk中提供了4个类用于线程间通信,分别是字节流和字符流,应用起来大体相同:

    1.PipedInputStream和PipedOutputStream

    2.PipedReader和PipedWriter

    public class WriteData {
        public void writeMethod(PipedWriter out){
            try {
                System.out.println("write:");
                for (int i = 0; i < 100; i++) {
                    String data=""+i;
                    out.write(data);
                    System.out.print(data);
                }
                System.out.println();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public class ReadData {
        public void readMethod(PipedReader in){
            try {
                System.out.println("read:");
                char[] byteArray = new char[20];
                int readLength=in.read(byteArray);
                while (readLength!=-1){
                    String newData = new String(byteArray, 0, readLength);
                    System.out.print(newData);
                    readLength=in.read(byteArray);
                }
                System.out.println();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public class ThreadWrite extends Thread {
        private WriteData write;
        private PipedWriter out;
    
        public ThreadWrite(WriteData write, PipedWriter out) {
            this.write = write;
            this.out = out;
        }
    
        @Override
        public void run() {
            write.writeMethod(out);
        }
    }
    
    public class ThreadRead extends Thread{
        private ReadData read;
        private PipedReader in;
    
        public ThreadRead(ReadData read, PipedReader in) {
            this.read = read;
            this.in = in;
        }
    
        @Override
        public void run() {
            read.readMethod(in);
        }
    }
    
    public class Run {
        public static void main(String[] args) {
            try {
                WriteData writeData = new WriteData();
                ReadData readData = new ReadData();
    
                PipedWriter pipedWriter = new PipedWriter();
                PipedReader pipedReader = new PipedReader();
                //通过这一行使得输入流和输出流联系起来
                pipedReader.connect(pipedWriter);
    
                ThreadWrite threadWrite = new ThreadWrite(writeData, pipedWriter);
                threadWrite.start();
    
                Thread.sleep(2000);
    
                ThreadRead threadRead = new ThreadRead(readData, pipedReader);
                threadRead.start();
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    java
    图解MotionEvent中getRawX、getRawY与getX、getY以及View中的getScrollX、getScrollY
    ListView分栏--制作分栏音乐列表
    Android中Touch事件的传递机制
    Android进程间通信之使用AIDL
    Android进程间通信之使用Messenger
    Android Mms之短信接收流程--从Framework到App
    Android组件的使用:ListView、GridView
    Android组件的使用:AutoCompleteTextView、Spinner
    Android组件的使用:DatePicker,TimePicker
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9293173.html
Copyright © 2011-2022 走看看