多线程 通过管道进行线程间通信

小鱼儿 2022-06-10 13:26 282阅读 0赞

通过管道进行线程间通信
* 在Java语言中提供了各种各样的输入/输出流Stream,使我们能够狠方便地对数据进行操作,其中管道
流式一种特殊的流,用于在不同线程间直接传输数据。一个线程发送数据到输出管道,另一个线程
从输入管道中读数据。通过使用管道,实现不同线程间的通信。

  1. \* javaJDK中提供了4个类来使线程间可以进行通信
  2. 1. PipedInputStreamPipedOutputStream
  3. 2. PipedReaderPipedWriter
  1. 字节流
    * 举个栗子
    1. public class WriteData \{
    2. public void writeMethod(PipedOutputStream out)\{
    3. try\{
    4. System.out.println("write :");
    5. for(int i=0;i<300;i++)\{
    6. String outData=""+(i+1);
    7. out.write(outData.getBytes());
    8. System.out.print(outData);
    9. \}
    10. System.out.println();
    11. out.close();
    12. \}catch (IOException e)\{
    13. e.printStackTrace();
    14. \}
    15. \}
    16. \}
  1. public class ReadData \{
  2. public void readMethod(PipedInputStream input)\{
  3. try \{
  4. System.out.println("read :");
  5. byte\[\] byteArray=new byte\[20\];
  6. int readLength=input.read(byteArray);
  7. while(readLength!=-1)\{
  8. String newData=new String(byteArray,0,readLength);
  9. System.out.print(newData);
  10. readLength=input.read(byteArray);
  11. \}
  12. System.out.println();
  13. input.close();
  14. \}catch (IOException e)\{
  15. e.printStackTrace();
  16. \}
  17. \}
  18. \}
  19. public class ThreadWrite extends Thread \{
  20. private WriteData write;
  21. private PipedOutputStream out;
  22. public ThreadWrite(WriteData write,PipedOutputStream out)\{
  23. super();
  24. this.write=write;
  25. this.out=out;
  26. \}
  27. @Override
  28. public void run() \{
  29. write.writeMethod(out);
  30. \}
  31. \}
  32. public class ThreadRead extends Thread\{
  33. private ReadData read;
  34. private PipedInputStream input;
  35. public ThreadRead(ReadData read,PipedInputStream input)\{
  36. super();
  37. this.read=read;
  38. this.input=input;
  39. \}
  40. @Override
  41. public void run() \{
  42. read.readMethod(input);
  43. \}
  44. \}
  45. public class Run \{
  46. public static void main(String\[\] args)\{
  47. try\{
  48. WriteData writeData=new WriteData();
  49. ReadData readData=new ReadData();
  50. PipedInputStream inputStream=new PipedInputStream();
  51. PipedOutputStream outputStream=new PipedOutputStream();
  52. outputStream.connect(inputStream);
  53. ThreadRead threadRead=new ThreadRead(readData,inputStream);
  54. threadRead.start();
  55. Thread.sleep(2000);
  56. ThreadWrite threadWrite=new ThreadWrite(writeData,outputStream);
  57. threadWrite.start();
  58. \}catch (IOException e)\{
  59. e.printStackTrace();
  60. \}catch (InterruptedException e)\{
  61. e.printStackTrace();
  62. \}
  63. \}
  64. \}
  65. 注释:outputStream.connect(inputStream)的作用使两个Stream之间产生通信链接。
  66. 在没有数据被写入是,int readLength=in.read(byteArray)处于阻塞状态,直到
  67. 有数据被写入,才继续向下运行。
  1. 字符流
    * 举个栗子
    1. public class WriteData \{
    2. public void writeMethod(PipedWriter out)\{
    3. try\{
    4. System.out.println("write :");
    5. for(int i=0;i<300;i++)\{
    6. String outData=""+(i+1);
    7. out.write(outData);
    8. System.out.print(outData);
    9. \}
    10. System.out.println();
    11. out.close();
    12. \}catch (IOException e)\{
    13. e.printStackTrace();
    14. \}
    15. \}
    16. \}
    17. public class ReadData \{
    18. public void readMethod(PipedReader input)\{
    19. try\{
    20. System.out.println("read :");
    21. char\[\] byteArray=new char\[20\];
    22. int readLength=input.read(byteArray);
    23. while(readLength!=-1)\{
    24. String newData=new String(byteArray,0,readLength);
    25. System.out.print(newData);
    26. readLength=input.read(byteArray);
    27. \}
    28. System.out.println();
    29. input.close();
    30. \}catch (IOException e)\{
    31. e.printStackTrace();
    32. \}
    33. \}
    34. \}
    35. public class ThreadWrite extends Thread\{
    36. private WriteData write;
    37. private PipedWriter out;
    38. public ThreadWrite(WriteData write,PipedWriter out)\{
    39. super();
    40. this.write=write;
    41. this.out=out;
    42. \}
  1. @Override
  2. public void run() \{
  3. write.writeMethod(out);
  4. \}
  5. \}
  6. public class ThreadRead extends Thread\{
  7. private ReadData read;
  8. private PipedReader input;
  9. public ThreadRead(ReadData read,PipedReader input)\{
  10. super();
  11. this.read=read;
  12. this.input=input;
  13. \}
  14. @Override
  15. public void run() \{
  16. read.readMethod(input);
  17. \}
  18. \}
  19. public class Run \{
  20. public static void main(String\[\] args)\{
  21. try\{
  22. WriteData writeData=new WriteData();
  23. ReadData readData=new ReadData();
  24. PipedReader inputStream=new PipedReader();
  25. PipedWriter outputStream=new PipedWriter();
  26. outputStream.connect(inputStream);
  27. ThreadRead threadRead=new ThreadRead(readData,inputStream);
  28. threadRead.start();
  29. Thread.sleep(2000);
  30. ThreadWrite threadWrite=new ThreadWrite(writeData,outputStream);
  31. threadWrite.start();
  32. \}catch (IOException e)\{
  33. e.printStackTrace();
  34. \}catch (InterruptedException e)\{
  35. e.printStackTrace();
  36. \}
  37. \}
  38. \}
  39. \* 和字节流类似,就是输入输出会更加方便。

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线通信管道

    管道输入/输出流 管道流是是一种使用比较少的线程间通信方式,管道输入/输出流和普通文件输入/输出流或者网络输出/输出流不同之处在于,它主要用于线程之间的数据传输,传输的媒介为