0

- 자바에서 소비자의 구현과 내가 나오지 않았어자바 예를 들어 나는 단순한 생산자를 찾고 있어요

바퀴를 재발견하고 싶지 않아 새로운 동시성 패키지와 Piped 클래스 중 하나를 사용하는 예제를 찾으십시오

여기에 PipedInputStream과 새로운 Java 동시성 패키지를 모두 사용하는 예제가 있습니까?

그런 작업에 Piped 클래스를 사용하지 않고 더 좋은 방법이 있습니까?

+0

정확히 무엇을 달성하려고합니까? 당신은 매우 광범위한 질문을했습니다. 파이프가있는 스트림으로 작업하면 스레드를 시작하는 데 신경 쓰지 않아도됩니다. –

+0

소비자와 생산자를 위해'Runnable'을 만들어서'ExecutorService'에 제출하고 싶습니까? – trutheality

+0

작업은 단순히 데이터베이스에서 읽은 다음 비 차단/비동기/버퍼 방식으로 파일에 쓰고 질문에 언급 된 도구는 작업에 적합한 도구라고 생각한 것입니다. 다른 방법으로, 나는 기꺼이 듣겠습니다 –

답변

4

작업을 수행 할 때 데이터베이스에서 읽는 동안 하나의 스레드 만 사용하고 BufferedOutputStream을 사용하여 파일에 쓰는 것으로 충분할 수 있습니다.

class Producer implements Runnable { 

    private final OutputStream out; 
    private final SomeDBClass db; 

    public Producer(OutputStream out, SomeDBClass db){ 
     this.out = out; 
     this.db = db; 
    } 

    public void run(){ 
     // If you're writing to a text file you might want to wrap 
     // out in a Writer instead of using `write` directly. 
     while(db has more data){ 
      out.write(the data); 
     } 
     out.flush(); 
     out.close(); 
    } 
} 

class Consumer implements Runnable { 

    private final InputStream in; 
    private final OutputStream out; 
    public static final int CHUNKSIZE=512; 

    public Consumer(InputStream in, OutputStream out){ 
     this.out = out; 
     this.in = in; 
    } 

    public void run(){ 
     byte[] chunk = new byte[CHUNKSIZE]; 

     for(int bytesRead; -1 != (bytesRead = in.read(chunk,0,CHUNKSIZE));;){ 
      out.write(chunk, 0, bytesRead); 
     } 
     out.close(); 
    } 
} 

그리고 호출 코드 :

FileOutputStream toFile = // Open the stream to a file 
SomeDBClass db = // Set up the db connection 
PipedInputStream pi = new PipedInputStream(); // Optionally specify a size 
PipedOutputStream po = new PipedOutputStream(pi); 

ExecutorService exec = Executors.newFixedThreadPool(2); 
exec.submit(new Producer(po, db)); 
exec.submit(new Consumer(pi, toFile)); 
exec.shutdown(); 
는 버퍼 크기와 덩어리의 크기보다 효율적으로 관리 파일에 기록하려면

, 당신은 이런 식으로 뭔가를 할 수

  • throw 될 수있는 예외도 잡으십시오.

이 모든 작업을 수행하는 경우 ExecutorService을 사용하면 이점이 없습니다. Executors는 많은 작업 (동시에 많은 스레드를 실행할 수있는 너무 많은 작업)이있는 경우 유용합니다. 여기서 동시에 실행해야하는 스레드는 두 개 뿐이므로 Thread#start을 직접 호출하면 오버 헤드가 줄어 듭니다.

관련 문제