Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 BlockingQueue对实现生产者/消费者系统有用吗?_Java_Multithreading_Thread Safety_Blocking - Fatal编程技术网

Java BlockingQueue对实现生产者/消费者系统有用吗?

Java BlockingQueue对实现生产者/消费者系统有用吗?,java,multithreading,thread-safety,blocking,Java,Multithreading,Thread Safety,Blocking,我有两个线程读取两个文件。每个线程从对象收集信息。当两个线程继续读取文件时,我希望将生成的对象添加到由线程共享的映射或临时列表中,并且在添加对象时同时处理映射/临时列表中添加的对象 我对使用生产者/消费者模型对此感兴趣。但是,在一个本身依赖于两个线程的进程上使用它会是一种方式吗?在这些情况下是否可以使用BlockingQueues?除非文件太大而无法放入内存,否则最好先将所有文件1读入内存,然后将所有文件2读入内存,然后再对其进行处理-理想情况下,这只需要两次磁盘搜索。如果您试图同时读取这两个文

我有两个线程读取两个文件。每个线程从对象收集信息。当两个线程继续读取文件时,我希望将生成的对象添加到由线程共享的映射或临时列表中,并且在添加对象时同时处理映射/临时列表中添加的对象


我对使用生产者/消费者模型对此感兴趣。但是,在一个本身依赖于两个线程的进程上使用它会是一种方式吗?在这些情况下是否可以使用
BlockingQueue
s?

除非文件太大而无法放入内存,否则最好先将所有文件1读入内存,然后将所有文件2读入内存,然后再对其进行处理-理想情况下,这只需要两次磁盘搜索。如果您试图同时读取这两个文件,那么将导致磁头在这两个文件之间进行大量查找

如果文件太大,无法放入内存,则读取File1的一个块,然后读取File2的一个块,然后处理这些块并将其引用设为null,以便垃圾收集器能够处理它们;重复此操作,直到文件完全处理完毕


一旦文件被读入内存,您就可以并行处理它们,然后一个
阻塞队列将是一个合适的数据结构。

除非文件太大而无法装入内存,否则最好将所有文件1读入内存,然后将所有文件2读入内存,然后处理它们——理想情况下,这只需要两次磁盘搜索。如果您试图同时读取这两个文件,那么将导致磁头在这两个文件之间进行大量查找

如果文件太大,无法放入内存,则读取File1的一个块,然后读取File2的一个块,然后处理这些块并将其引用设为null,以便垃圾收集器能够处理它们;重复此操作,直到文件完全处理完毕


一旦文件被读入内存,您就可以并行处理它们,然后一个
阻塞队列将是一个合适的数据结构。

阻塞队列肯定是您想要的
如中所述
“BlockingQueue实现主要用于生产者-消费者队列,但还支持收集接口。”

BlockingQueue绝对是您想要的
如中所述
“BlockingQueue实现主要用于生产者-消费者队列,但还支持收集接口。”

是。我使用了
BlockingQueue
解决了一个非常类似的问题。当然,是的。生产者线程排队、消费者线程块和出列。是。我使用了
BlockingQueue
解决了一个非常类似的问题。当然,是的。生产者线程排队、消费者线程块和出列。在具有巨大文件系统缓存的系统上,这可能不是问题。:-)这些文件很大。每个文件的大小可能在200-600 mb之间,如果我从文件中获得足够的信息用于其他进程,我不需要读取整个文件。这就是为什么我需要使用线程3同时处理它们的内容。一旦线程3有足够的信息,它就会终止另外两个线程。@Balaram26在这种情况下(您希望提前终止),在工作线程中,不要忘记经常检查
thread.interrupted()
,并在返回true时退出循环。在具有巨大文件系统缓存的系统上,这可能不是问题。:-)这些文件很大。每个文件的大小可能在200-600 mb之间,如果我从文件中获得足够的信息用于其他进程,我不需要读取整个文件。这就是为什么我需要使用线程3同时处理它们的内容。一旦线程3有足够的信息,它就会终止另外两个线程。@Balaram26在这种情况下(您希望提前终止),在工作线程中,不要忘记经常检查
thread.interrupted()
,并在返回true时退出循环。