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时退出循环。