当前位置: 首页 > 知识库问答 >
问题:

按顺序读取文件并将其传递给多个线程

沈冠宇
2023-03-14

我有一个巨大的文件,里面有大约100万条记录。我的要求是从文件中读取记录,并具有可配置数量的线程,这些线程跨多个线程处理记录。

目前,我正在使用单个线程读取该文件,并将其存储到一个集合中。

如何将集合元素按顺序传递给不同的线程进行进一步处理?

共有1个答案

乜飞航
2023-03-14

可以

您的需求似乎或多或少是生产者-消费者范式生产者-消费者范式。如果您使用的是Java1.5及以上版本,那么可以通过使用并发集合来实现。

BlockingQueue sharedQueue = new LinkedBlockingQueue();
//You can select any Collection Object above which implements BlockingQueue 

您可以找到其他实现BlockingQueue的类

好的。!在这里,你的文件的阅读块将存储在你的share dQueue中,这意味着你的阅读逻辑将充当生产者。

例如,在阅读文件线程中:

 @Override
public void run() {

    // read your file and put reading chunks in Queue 
       sharedQueue.put(yourReadingCHunk);
}

在消费者线程中,您将尝试从该队列中获取这些块。

@Override
    public void run() {
        while(true){
            try {
                System.out.println("Consumed: "+ sharedQueue.take());
            } catch (InterruptedException ex) {

            }
        }
    }

唯一的问题是,在创建如下线程时,必须传递shareQueue

   Thread iamreading= new Thread(new YourReadingFileClass(sharedQueue));
   Thread iamUsing = new Thread(new YourUsingFileClass(sharedQueue));

有关使用此链接的生产者和消费者问题的更多信息

 类似资料:
  • 问题内容: 我实现了一个小的IO类,它可以从不同磁盘(例如,两个包含相同文件的硬盘)上的多个相同文件中读取数据。在顺序情况下,两个磁盘在文件上的平均读取速度均为60MB / s,但是当我进行交错操作(例如4k磁盘1、4k磁盘2然后合并)时,有效读取速度会降低到40MB / s而不是增加吗? 上下文:Win 7 + JDK 7b70、2GB RAM,2.2GB测试文件。基本上,我尝试以穷人的方式模仿

  • 问题内容: 使用ServiceStack,是否可以执行多个读取命令(特别是ContainsKey命令)? 存储的对象需要一段时间才能从数据库中获取,因此我们希望仅获取那些不在缓存中的对象。 我知道我可以向redis请求该对象,然后从数据库中获取是否返回null,但是存储的对象相当大,所以我宁愿只获取布尔列表,然后确定要查询的id在数据库中。 目前,我正在遍历我的Ids列表(最多100个左右),并在

  • 第一次使用python。我正在尝试浏览包含段落和表格的word文档。我已经弄清楚了如何使用以下代码浏览文档中的所有段落和文档中的所有表格: 但我正试图找到一种方法,像任何阅读它的人一样,有序地浏览这份文件。所以如果我们有一份文件包含: 它会按照这个顺序读。我想这样做的原因是,根据表格后面的段落,我想对它执行不同的操作。

  • 本文向大家介绍C#程序将参数传递给线程,包括了C#程序将参数传递给线程的使用技巧和注意事项,需要的朋友参考一下 要使用线程,请在代码中添加以下命名空间- 首先,您需要在C#中创建一个新线程- 上面,threadDemo是我们的线程函数。 现在将参数传递给线程- 上面设置的参数是- 示例 让我们看完整的代码,以将参数传递给C#中的线程。 输出结果

  • 我正在尝试在我的Spark应用程序中使用多个(通过include)类型安全配置文件,我正在集群模式下提交给一个YARN队列。我基本上有两个配置文件,下面提供了文件布局: null 上面的两个文件都是我的application.jar的外部文件,所以我使用“--files”(可以在下面看到)将它们传递给yarn 我正在使用Typesafe配置库来解析我的“application-main.conf”