0

GUI 가든 콘솔이든 관계없이 Consumer과 어떻게 상호 작용합니까? consume을 공개 또는 패키지 개인으로 공개해야합니까? 마치 지뢰 지대에 들어가는 것처럼 보입니다.Swing 또는 Console에서 BlockingQueue에 액세스하려면 어떻게해야합니까?

소비자 :

package net.bounceme.dur.client; 

import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.util.concurrent.BlockingQueue; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import net.bounceme.dur.data.State; 
import net.bounceme.dur.data.Title; 

public class Consumer implements Runnable { 

    private final BlockingQueue<Title> queue; 
    private ObjectOutputStream objectOutputStream = null; 

    public Consumer(BlockingQueue<Title> queue, ObjectOutputStream objectOutputStream) { 
     this.queue = queue; 
     this.objectOutputStream = objectOutputStream; 
    } 

    private void consume() throws InterruptedException, IOException { 
     Title title = queue.take(); 
     title.setState(State.x); 
     objectOutputStream.writeObject(title); 
    } 

    @Override 
    public void run() { 
     try { 
      consume(); 
     } catch (InterruptedException | IOException ex) { 
      Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex); 
      //exit? 
     } 
    } 
} 

서비스 :

package net.bounceme.dur.client; 

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.util.Properties; 
import java.util.concurrent.ArrayBlockingQueue; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.ConcurrentLinkedQueue; 
import java.util.concurrent.Executor; 
import java.util.logging.Logger; 
import net.bounceme.dur.data.Title; 

public class ProducerConsumerService implements Executor { 

    private static final Logger log = Logger.getLogger(ProducerConsumerService.class.getName()); 
    private final BlockingQueue<Title> queue = new ArrayBlockingQueue<>(1); 
    private Producer producer = null; 
    private Consumer consumer = null; 

    public void ProducerConsumerService() { 
    } 

    public void produce() { 
    } 

    public void consume() { 
    } 

    public void startService() throws IOException { 
     Properties props = PropertiesReader.getProps(); 
     int portNumber = Integer.parseInt(props.getProperty("port")); 
     String host = props.getProperty("server"); 
     Socket socket = new Socket(host, portNumber); 
     ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     producer = new Producer(queue, objectInputStream); 
     consumer = new Consumer(queue, objectOutputStream); 
     new Thread((Runnable) producer).start(); 
     new Thread((Runnable) consumer).start(); 
     log.info("started..."); 
    } 

    @Override 
    public void execute(Runnable command) { 
     new Thread(command).start(); 
    } 
} 

또는 교대의 BlockingQueue를 액세스하기 위해이 서비스에 메소드를 추가합니까? 그러나 이렇게하면 Consumer 클래스 자체의 필요성을 없애는 것으로 보입니다.

Console 또는 Swing 인터페이스 중 하나 인 외부 클래스에서이 세 클래스의 올바른 사용법은 무엇입니까?

참고 : 다음과 같은 솔루션을

http://www.journaldev.com/1034/java-blockingqueue-example-implementing-producer-consumer-problem

+1

보통 나는 제작자와 소비자를 건설 시간에 중재자와 연결합니다 ... 단지 BlockingQueue이거나 더 중요한 것일 수 있습니다. 규모를 늘리면 좋은 디자인으로 인해 제작자와 소비자를 독립적으로 확장 할 수 있습니다. –

+0

그래서 Swing 클래스는 서비스 인스턴스에서 직접'BlockingQueue'에'take' 및'put' 할 수 있습니까? – Thufir

답변

0

내 관심사 :

package net.bounceme.dur.client; 

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.util.Properties; 
import java.util.concurrent.ArrayBlockingQueue; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.Executor; 
import java.util.logging.Logger; 
import net.bounceme.dur.data.Title; 

public class ProducerConsumerService implements Executor { 

    private static final Logger log = Logger.getLogger(ProducerConsumerService.class.getName()); 
    private final BlockingQueue<Title> queue = new ArrayBlockingQueue<>(1); 
    private Producer producer = null; 
    private Consumer consumer = null; 
    private Title title = null; 

    public void ProducerConsumerService() { 
    } 

    public Title produce() throws InterruptedException, IOException, ClassNotFoundException { 
     producer.produce(); 
     title = queue.take(); 
     consumer.consume(title); 
     return title; 
    } 

    public void startService() throws IOException { 
     Properties props = PropertiesReader.getProps(); 
     int portNumber = Integer.parseInt(props.getProperty("port")); 
     String host = props.getProperty("server"); 
     Socket socket = new Socket(host, portNumber); 
     ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     producer = new Producer(queue, objectInputStream); 
     consumer = new Consumer(queue, objectOutputStream); 
     new Thread((Runnable) producer).start(); 
     new Thread((Runnable) consumer).start(); 
     log.info("started..."); 
    } 

    @Override 
    public void execute(Runnable command) { 
     new Thread(command).start(); 
    } 
} 

는 서비스의 produce() 방법으로 ProduceerConsumer 너무 많이 노출시켜 캡슐을 나누기 때문이다.