多线程学习笔记--04线程间的通信(通信管道实现线程间的通信)

 1.线程间的通信

       通过管道实现线程间的通信:字节流

       通信关单实现线程间的通信:字符流

       等待通知之交叉备份

       java的各种流中有一种叫管道流(pipeStream),用于在不同的线程之间直接传送数据,一个线程发送数据到输出管道,另一个线程从从输入管道中读取数据,通过使用管道实现不同线程间的通信

     提供四个类来实现通信:

    PipeInputStram PipeOutputStram

    PipedReader     PipedWriter

   用管道流的时候记得有一个流的连接操作

 2.通过管道实现线程间的通信:字节流

    负责写数据的类:

package com.wx.threadlearn3;
import java.io.IOException;
import java.io.PipedOutputStream;

public class WriteData {

    public void writeData(PipedOutputStream outputStream)
    {
      try{
          String data="123456789987654321";
          outputStream.write(data.getBytes());
          outputStream.close();
      }catch (IOException e)
      {
          e.printStackTrace();
      }
    }
}

    负责读数据的类:

package com.wx.threadlearn3;

import java.io.PipedInputStream;

public class ReadData {
    public  void readData(PipedInputStream pipedInputStream)
    {
        try{
            byte[] buffer=new byte[10];
            int length=pipedInputStream.read(buffer);
            while(length!=-1)
            {
                String s = new String(buffer, 0, length);
                System.out.println(s);
            }
            pipedInputStream.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

    写数据的线程:

package com.wx.threadlearn3;

import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class WriteThread implements  Runnable {
    private WriteData writeData;
    private PipedOutputStream outputStream;
    public WriteThread(WriteData writeData,PipedOutputStream pipedOutputStream)
    {
        this.writeData=writeData;
        this.outputStream=pipedOutputStream;
    }
    @Override
    public void run() {
        writeData.writeData(outputStream);
    }
}

  读数据的线程:

package com.wx.threadlearn3;

import java.io.PipedInputStream;

public class ReadThread implements Runnable {
    private ReadData readData;
    private PipedInputStream pipedInputStream;
    public ReadThread(ReadData readData,PipedInputStream pipedInputStream)
    {
        this.pipedInputStream=pipedInputStream;
        this.readData=readData;
    }
    @Override
    public void run() {
        readData.readData(pipedInputStream);
    }
}

    测试:

package com.wx.threadlearn3;

import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class Test {
    public static void main(String[] args)
    {
        try {
            WriteData writeData = new WriteData();
            ReadData readData=new ReadData();
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStrea=new PipedOutputStream();
            pipedOutputStrea.connect(pipedInputStream);
            WriteThread writeThread=new WriteThread(writeData,pipedOutputStrea);
            ReadThread readThread = new ReadThread(readData,pipedInputStream);

            Thread thread1=new Thread(readThread);
            thread1.start();
            Thread.sleep(2000);
            Thread thread=new Thread(writeThread);
            thread.start();

        }catch (Exception e)
        {
            e.printStackTrace();
        }


    }
}

  

 3.通信关单实现线程间的通信:字符流

package com.wx.threadlearn4;
import java.io.IOException;
import java.io.PipedOutputStream;
import java.io.PipedWriter;

public class WriteData {

    public void writeData(PipedWriter pipedWriter)
    {
      try{

          for(int i=0;i<300;i++)
          {
              pipedWriter.write((i+""));
          }
          pipedWriter.close();
      }catch (IOException e)
      {
          e.printStackTrace();
      }
    }
}

package com.wx.threadlearn4;

import java.io.PipedInputStream;
import java.io.PipedReader;

public class ReadData {
    public  void readData(PipedReader pipedReader)
    {
        try{
            char[] buffer=new char[10];
            int length=pipedReader.read(buffer);
            while(length!=-1)
            {
                String s = new String(buffer, 0, length);
                System.out.print(s+"空额");
                pipedReader.read(buffer);
            }
            pipedReader.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
package com.wx.threadlearn4;
import java.io.PipedWriter;

public class WriteThread implements  Runnable {
    private WriteData writeData;
    private PipedWriter pipedWriter;
    public WriteThread(WriteData writeData,PipedWriter pipedWriter)
    {
        this.writeData=writeData;
        this.pipedWriter=pipedWriter;
    }
    @Override
    public void run() {
        writeData.writeData(pipedWriter);
    }
}
package com.wx.threadlearn4;

import java.io.PipedInputStream;
import java.io.PipedReader;

public class ReadThread implements Runnable {
    private ReadData readData;
    private PipedReader pipedReader;
    public ReadThread(ReadData readData, PipedReader pipedReader)
    {
        this.pipedReader=pipedReader;
        this.readData=readData;
    }
    @Override
    public void run() {

        readData.readData(pipedReader);
    }
}
package com.wx.threadlearn4;

import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PipedReader;
import java.io.PipedWriter;

public class Test {
    public static void main(String[] args)
    {
        try {
            WriteData writeData = new WriteData();
            ReadData readData=new ReadData();
            PipedReader pipedReader=new PipedReader();
            PipedWriter pipedWriter=new PipedWriter();
            pipedReader.connect(pipedWriter);
            WriteThread writeThread=new WriteThread(writeData,pipedWriter);
            ReadThread readThread = new ReadThread(readData,pipedReader);

            Thread thread1=new Thread(readThread);
            thread1.start();
            Thread.sleep(2000);
            Thread thread=new Thread(writeThread);
            thread.start();

        }catch (Exception e)
        {
            e.printStackTrace();
        }


    }
}

 4.等待通知之交叉备份:

  创建20个线程,10个线程叫数据备份到A数据库,10个线程将数据备份到B数据库并且他们是交替进行的。

package com.wx.threadlearn5;

public class DBTools {
    volatile private boolean flag=true;
    synchronized public void backA()
    {
        try{
            while(flag==true)
            {
                System.out.println("backA处于的wait前面");
                wait();
                System.out.println("backA的wait后面");
            }
            System.out.println("数据库A备份完成");
            flag=true;
            notifyAll();
            System.out.println("唤醒B");
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    synchronized public void backB()
    {
        try{
            while(flag==false)
            {
                System.out.println("backB处于的wait前面");
                wait();
                System.out.println("backB的wait后面");
            }
            System.out.println("数据库B备份完成");
            flag=false;
            notifyAll();
            System.out.println("唤醒A");
        }catch (Exception e)
        {
            e.printStackTrace();
        }

    }
}
package com.wx.threadlearn5;
public class ThreadA extends Thread {
    private DBTools dbTools;
    public ThreadA(DBTools dbTools)
    {
        this.dbTools=dbTools;
    }
    @Override
    public void run() {
        super.run();
        /*
        线程A备份数据库
         */
        dbTools.backA();
    }
}
package com.wx.threadlearn5;

public class ThreadB extends Thread {
    private DBTools dbTools;
    public ThreadB(DBTools dbTools)
    {
        this.dbTools=dbTools;
    }
    @Override
    public void run() {
        super.run();
        /*
        线程B备份数据库
         */
        dbTools.backB();
    }
}
package com.wx.threadlearn5;

public class Test1 {
    public static void main(String[] args)
    {
        DBTools dbTools = new DBTools();
        for (int i=0;i<20;i++)
        {
            ThreadA threadA = new ThreadA(dbTools);
            ThreadB threadB=new ThreadB(dbTools);
            threadA.start();
            threadB.start();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/84762841