본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

한 스레드에서 생성한 데이터를 다른 스레드에서 읽을 수 있는 PipeReader와 PippedWriter

PipeReader와 PippedWriter
쓰레드간에 데이터를 주고받을때 사용된다.

한 스레드에서 생성한 데이터를 다른 스레드에서 읽을 수 있다.
입출력스트림을 하나의 스트림으로 연결해서 데이터를 주고받으며 입출력을 마친이후 한쪽스트림만 닫아도 나머지 스트림은 자동으로 닫힌다.

 

 

`PipedWriter`로 데이터를 쓰고, `PipedReader`로 데이터를 읽는 스레드 간 통신을 보여주는 예시이다.
`WriterTask` 클래스는 파이프에 데이터를 쓰고 `ReaderTask` 클래스는 파이프에서 데이터를 읽는다.

import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

public class PipeExample {
    public static void main(String[] args) {
        try {
            // PipedWriter와 PipedReader 인스턴스 생성
            PipedWriter writer = new PipedWriter();
            PipedReader reader = new PipedReader(writer);

            // 쓰기 스레드 생성
            Thread writerThread = new Thread(new WriterTask(writer));
            // 읽기 스레드 생성
            Thread readerThread = new Thread(new ReaderTask(reader));

            // 스레드 시작
            writerThread.start();
            readerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 데이터를 쓰는 스레드
class WriterTask implements Runnable {
    private PipedWriter writer;

    public WriterTask(PipedWriter writer) {
        this.writer = writer;
    }

    @Override
    public void run() {
        try {
            // 데이터 쓰기
            for (int i = 0; i < 5; i++) {
                writer.write("Message " + i + "\n");
                Thread.sleep(1000); // 1초 대기
            }
            writer.close(); // 쓰기 완료 후 스트림 닫기
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

// 데이터를 읽는 스레드
class ReaderTask implements Runnable {
    private PipedReader reader;

    public ReaderTask(PipedReader reader) {
        this.reader = reader;
    }

    @Override
    public void run() {
        try {
            int data;
            // 데이터 읽기
            while ((data = reader.read()) != -1) {
                System.out.print((char) data);
            }
            reader.close(); // 읽기 완료 후 스트림 닫기
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

`PipedWriter`로 데이터를 쓰고, `PipedReader`로 데이터를 읽는 스레드 간 통신을 보여주는 예시이다.
`WriterTask` 클래스는 파이프에 데이터를 쓰고 `ReaderTask` 클래스는 파이프에서 데이터를 읽는다.