본문 바로가기
Old Posts/Java

Java NIO - Pipe

by A6K 2021. 1. 6.

파이프(Pipe)는 두 스레드를 연결해주는 'One-way' 데이터 커넥션이다. 파이프(Pipe)에는 데이터를 쓸 수 있는 싱크채널(Sink Channel)과 데이터를 읽어가는 소스채널(Source Channel)이 있다.

싱크채널에 데이터를 써주면 파이프를 통해 소스채널로 전달되고, 다른 스레드가 소스채널을 통해 데이터를 읽을 수 있다.

Pipe pipe = Pipe.open();

우선 파이프 객체를 가져온다.

Pipe.SinkChannel sinkChannel = pipe.sink();

String data = "Send message";

ByteBuffer buffer = ByteBuffer.allocate(64);
buffer.clear();
buffer.put(data.getBytes());

buffer.flip();

while(buffer.hasRemaining()) {
    sinkChannel.write(buffer);
}

스레드 1번이 이런 코드로 파이프에 데이터를 쓰게 된다.

우선 파이프 객체에서 sink() 메소드를 호출하면 SinkChannel객체를 가져올 수 있다. 바이트버퍼에 데이터를 세팅하고, write() 메소드를 이용해서 데이터를 파이프에 쓴다.

Pipe.SourceChannel sourceChannel = pipe.source();

ByteBuffer buffer = ByteBuffer.allocate(64);
int bytesRead = inChannel.read(buffer);

데이터를 읽어 갈 스레드 2번은 pipe.source() 메소드로 소스채널을 가져온다. 이 소스채널에서 데이터를 읽게 된다.

댓글