Java 安全地将ByteBuffer发布到工作线程
我正在使用java.nio选择器编写一个网络服务器。它的设计目的是从网络获取数据并将其推送到工作线程,工作线程执行一些数据处理 我不知道如何将读取字节传递给工作人员并从他们那里获得响应 目前,我正在考虑使用ByteBuffers的并发队列将读取的数据传递给工人Java 安全地将ByteBuffer发布到工作线程,java,multithreading,nio,Java,Multithreading,Nio,我正在使用java.nio选择器编写一个网络服务器。它的设计目的是从网络获取数据并将其推送到工作线程,工作线程执行一些数据处理 我不知道如何将读取字节传递给工作人员并从他们那里获得响应 目前,我正在考虑使用ByteBuffers的并发队列将读取的数据传递给工人 while(keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); keyIterator.remove(); if(!key.isVali
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
keyIterator.remove();
if(!key.isValid())
continue;
if(key.isAcceptable()) {
accept...
ConcurrentLinkedQueue<ByteBuffer> queue = new ConcurrentLinkedQueue<>();
key.attach(queue);
pushToWorker(queue);
}
if(key.isReadable()) {
ByteBuffer buffer = ByteBuffer.allocate(4096);
SocketChannel clientsc = (SocketChannel) key.channel();
clientsc.read(buffer);
ConcurrentLinkedQueue queue = (ConcurrentLinkedQueue) key.attachment();
queue.offer(buffer); //publication
...
}
...
}
while(keyIterator.hasNext()){
SelectionKey=keyIterator.next();
keyterator.remove();
如果(!key.isValid())
继续;
if(key.isAcceptable()){
接受
ConcurrentLinkedQueue=新建ConcurrentLinkedQueue();
键。附加(队列);
推送工(队列);
}
if(key.isReadable()){
ByteBuffer缓冲区=ByteBuffer.allocate(4096);
SocketChannel clientsc=(SocketChannel)key.channel();
clientsc.read(缓冲区);
ConcurrentLinkedQueue=(ConcurrentLinkedQueue)键。附件();
queue.offer(缓冲区);//发布
...
}
...
}
以这种方式发布ByteBuffer似乎不安全(请参见发布行)。什么是正确的方法?有什么简单的方法可以与员工沟通吗?这样做是安全的 提供所有必要的保证: 内存一致性影响:与其他并发集合一样,在将对象放入ConcurrentLinkedQueue之前,线程中的操作发生在另一个线程中从ConcurrentLinkedQueue访问或删除该元素之后的操作之前