欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

【Java 多线程】Java 线程间通信,

来源: javaer 分享于  点击 46209 次 点评:104

【Java 多线程】Java 线程间通信,


本文简单总结线程间通信的方式:

方法一:等待/通知机制

wait + notify + notifyAll的方式

方法二:通过管道进行线程间通信

使用Java给我们提供的管道流(pipeStream),在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据,
在Java 的JDK中提供了4个类来使线程间可以进行通信:
1)PipedInputStream 和 PipedOutputStream
2)PipedReader 和 PipedWriter

参考以下代码:

package study20170307;

import java.io.IOException;
import java.io.PipedInputStream;

/**
 * Created by apple on 17/3/7.
 */
public class ReadData {

    public void readMethod(PipedInputStream in){
        try {
            System.out.println("read:");
            byte[] bytes = new byte[200];
            int len = in.read(bytes);
            while (len != -1){
                String data = new String(bytes,0,len);
                System.out.println(data);
                len = in.read(bytes);
            }
            in.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
package study20170307;

import java.io.IOException;
import java.io.PipedOutputStream;

/**
 * Created by apple on 17/3/7.
 */
public class WriteData {

    public void writeMethod(PipedOutputStream out){

        System.out.println("write:");
        try {
            for (int i = 0;i<30;i++){
                out.write((""+ (i+1)).getBytes());
            }
            out.close();
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}
package study20170307;

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

/**
 * Created by apple on 17/3/7.
 */
public class ReadThread extends Thread{
    private ReadData readData;
    private PipedInputStream inputStream;

    public ReadThread(ReadData readData,PipedInputStream inputStream){
        this.inputStream = inputStream;
        this.readData = readData;
    }

    @Override
    public void run() {
        super.run();
        readData.readMethod(inputStream);
    }
}
package study20170307;

import java.io.PipedOutputStream;

/**
 * Created by apple on 17/3/7.
 */
public class WriteThread extends Thread {
    private WriteData writeData;
    private PipedOutputStream outputStream;

    public WriteThread(WriteData writeData,PipedOutputStream outputStream){
        this.outputStream = outputStream;
        this.writeData = writeData;
    }

    @Override
    public void run() {
        super.run();
        writeData.writeMethod(outputStream);
    }
}

package study20170307;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by apple on 17/3/7.
 */
public class Main {

    public static void main(String[] args) {

        ReadData readData = new ReadData();
        WriteData writeData = new WriteData();

        PipedInputStream inputStream = new PipedInputStream();
        PipedOutputStream outputStream = new PipedOutputStream();

        try {
            outputStream.connect(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        ReadThread readThread = new ReadThread(readData,inputStream);
        WriteThread writeThread = new WriteThread(writeData,outputStream);

        writeThread.start();
        readThread.start();

    }
}

运行结果为:

相关文章

    暂无相关文章
相关栏目:

用户点评