此方法按预期运行,因为它一次只从服务器获取一个对象,处理该对象,然后获取另一个对象。但是,似乎我需要将其内部翻出来,可能是生产者 - 消费者:
public void inputOutput() throws IOException, ClassNotFoundException {
Socket socket = new Socket(server, portNumber);
boolean eof = false;
Title title = null;
State state = State.undefined;
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream())) {
do {
try {
title = (Title) objectInputStream.readObject();
log.info(title.toString());
do {
state = State.undefined;
try {
c.printf("enter the state for record:");
state = State.valueOf(c.readLine());
} catch (java.lang.IllegalArgumentException iae) {
log.warning(Arrays.deepToString(State.values()));
}
} while (state == State.undefined);
title.setState(state);
title.setTitle("modified from client");
objectOutputStream.writeObject(title);
} catch (java.io.EOFException eofe) {
eof = true;
}
} while (!eof);
}
}
处理一个对象,然后将其发回,然后请求另一个对象的“流程”正是我想要复制的:
package net.bounceme.dur.client;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private final BlockingQueue<Message> queue;
public Producer(BlockingQueue<Message> q) {
this.queue = q;
}
@Override
public void run() {
//produce messages
for (int i = 0; i < 100; i++) {
Message msg = new Message("" + i);
try {
Thread.sleep(i);
queue.put(msg);
System.out.println("Produced " + msg.getMsg());
} catch (InterruptedException e) {
}
}
//adding exit message
Message msg = new Message("exit");
try {
queue.put(msg);
} catch (InterruptedException e) {
}
}
}
例如,Producer
只会通过objectInputStream.readObject();
处理来自套接字连接的对象吗?
如果是这样,我如何减慢生产者(从某个角度来看,也是消费者),这样它一次只“生成”一个对象,等待通知,然后,只有在通知时,回到另一个对象的流。
在客户的背景下,这是一个制作人,但从更广泛的角度来看,我认为它也是一个消费者。
制作人如何接收信号量或其他通知,然后“生成”另一个对象?
因为Producer实现了Runnable,所以我无法将参数传递给run。或许,ProducerConsumerService驱动程序可以暂停该线程吗?这似乎容易出错,至少。
代码来自:
http://www.journaldev.com/1034/java-blockingqueue-example-implementing-producer-consumer-problem
不需要明确的答案 - 我可能只是误解了如何将BlockingQueue与套接字一起使用。目前,我想保持服务器不变,以便它的响应/请求“流动”发送一个对象,然后等待响应,就像那样。
答案 0 :(得分:1)
一种解决方案是使用1 ArrayBlockingQueue
的大小。生产者一次只能放置一个对象,并等到消费者将其删除。
所以伪代码就像......
// Producer thread (produces serverside data)
obj = readObjFromServer();
sharedQueue.put(obj); // Blocks if there is already an object waiting
// Consumer thread
obj = sharedQueue.take(); // Blocks until data available
handleData(obj);