Java nio服务器客户端异步

时间:2012-08-09 18:57:05

标签: java multithreading sockets io socketchannel

我自己使用java nio和选择器创建了一个服务器。如果需要,我可以直接从客户端接收数据和答案。

但现在我想要一个处理数据的线程,并且只要它将数据发送到每个客户端。

那我怎么能这样做?另外如何在内存中保留所有通道以将数据写入每个客户端?

如果您需要,我可以使用java nio发布我的代码部分。

1 个答案:

答案 0 :(得分:1)

使用runnable创建一个新线程,并确保它知道您的服务器,因为您的服务器应该知道所有客户端。如果客户端发送消息通过数据处理器线程解析它并让它完成它的工作。处理完任务后,让服务器知道,以便更新所有客户端。

提示:您应该使用类似LinkedBlockingQueue的内容为处理线程创建一个等待队列,这样您就可以始终将任务放在队列中而无需等待任务完成。然后thead将等待队列中需要处理的内容。这样,当队列中存在实际任务时,处理线程将仅使用CPU资源

这是一个代码示例

public abstract class Queue implements Runnable {
private final LinkedBlockingQueue<Message> queue;

public Queue() {
    this.queue = new LinkedBlockingQueue<Message>();
}

/**
 * Adds a message to the queue.
 * @param message
 */
public void add(final Message message) {
    try {
        queue.put(message);
    } catch (final InterruptedException e) {
        e.printStackTrace();
    }
}

/**
 * Waits for new messages
 */
@Override
public void run() {
    while(true) {
        try {
            final Message message = queue.take();
            processMessage(message);
        } catch (final InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
* Processes the new message
*/
protected abstract void processMessage(Message message);

}