在处理数据之前如何暂停线程?发送信号量?

时间:2014-07-09 11:18:21

标签: java multithreading sockets semaphore blockingqueue

此方法按预期运行,因为它一次只从服务器获取一个对象,处理该对象,然后获取另一个对象。但是,似乎我需要将其内部翻出来,可能是生产者 - 消费者:

    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与套接字一起使用。目前,我想保持服务器不变,以便它的响应/请求“流动”发送一个对象,然后等待响应,就像那样。

1 个答案:

答案 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);