Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I/O线程的直接切换或阻塞队列?_Java_Multithreading_Performance_Io_Buffer - Fatal编程技术网

Java I/O线程的直接切换或阻塞队列?

Java I/O线程的直接切换或阻塞队列?,java,multithreading,performance,io,buffer,Java,Multithreading,Performance,Io,Buffer,如果我有一个使用FileChannel的I/O线程,我应该有一个方法来获取一个值,填充一个缓冲区并将其写入磁盘,还是应该有一个带缓存的有界队列来将块写入磁盘 这些值非常小,而且会有很多,因此从性能角度来看,我是否应该为FileChannel制作一个包装器,使其类似于BufferedWriter?还是直接切换和写入可以 如果我有一个使用FileChannel的I/O线程,我应该有一个接受值、填充缓冲区并将其写入磁盘的方法,还是应该有一个带缓存的有界队列,将块写入磁盘 稍微取决于应用程序的特性。如果

如果我有一个使用
FileChannel
的I/O线程,我应该有一个方法来获取一个值,填充一个缓冲区并将其写入磁盘,还是应该有一个带缓存的有界队列来将块写入磁盘

这些值非常小,而且会有很多,因此从性能角度来看,我是否应该为
FileChannel
制作一个包装器,使其类似于
BufferedWriter
?还是直接切换和写入可以

如果我有一个使用FileChannel的I/O线程,我应该有一个接受值、填充缓冲区并将其写入磁盘的方法,还是应该有一个带缓存的有界队列,将块写入磁盘

稍微取决于应用程序的特性。如果您正在对信息进行某些处理,那么您可能会受到处理器的限制,因此在从有限制的
阻塞队列
消费的同时,分叉一个线程来只对
文件通道
执行IO将是一个好主意。但CPU速度仍然大大超过IO,因此多线程的复杂性可能不是一个明显的胜利

如果确实使用了
阻塞队列
,请确保限制其大小,否则,如果生产者的生成速度比写入者快,则可能会填满内存

这些值非常小,而且会有很多,所以从性能的角度来看,我是否应该为FileChannel制作一个包装器,使其类似于BufferedWriter

对。考虑到每个值都很小,因此为每个
FileChannel
IO操作编写一个值将非常昂贵。缓冲一些值,然后将它们作为一个块写入,这会使性能得到很好的提高。当然值得编写缓冲区并对其进行测试