无论是来自GUI还是控制台,该如何与之交互Consumer
?我应该只是公开consume
地公开,还是私有包?看来它正在步入雷区。
消费者:
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
类本身的需要。
外部类(控制台或Swing接口)对这三个类的正确用法是什么?
参考:
http://www.journaldev.com/1034/java-blockingqueue-example-implementing-producer-consumer-problem
我关注以下解决方案:
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();
}
}
它通过暴露过多的服务Produceer
并Consumer
通过produce()
服务中的方法来破坏封装。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句