针对多个用户的csv的并发处理

时间:2013-04-19 08:32:19

标签: java multithreading concurrency throttling concurrent-programming

我有一个场景,我必须从用户的文件夹中处理CSV文件,并在处理后将它们存储到数据库中。我们每个用户有5种类型的Feed。 任何用户都可以在该文件夹中发送任何Feed,无论何时进行处理,都需要遵循以下规则:

  • 同一客户的相同类型的Feed无法在同一时间处理,必须始终阻止同时处理。
  • 不允许跨“x”以上客户端进行并发处理
  • 不允许同时处理同一客户端的“y”文件以上

实现这一目标的好方法是什么?

1 个答案:

答案 0 :(得分:0)

可以使用AtomicBoolean的地图实施第一个限制。这可能不需要是ConcurrentHashMap,因为初始化后您不会更改映射的键。完成后,不要忘记将Feed的值重置为false。

checkAndProcessFeed(Feed feed, Map<String, AtomicBoolean> map) {
    while(!map.get(feed.type).compareAndSet(false, true)) // assuming the AtomicBooleans were initialized to false
        Thread.sleep(500);
    }
    process(feed); // at this point map.get(feed.type).get() == true
    map.get(feed.type).set(false); // reset the AtomicBoolean to false
}

其他两个限制可以用AtomicInteger实现,用于维护客户端和每个客户端文件的数量;处理完成时递减,并使用比较和设置递增以启动新的客户端/文件。

final int maxClient = 5;
AtomicInteger clientCount = new AtomicInteger(0);
ConcurrentLinkedQueue<Client> queue = new ConcurrentLinkedQueue<>(); // hold waiting clients
while(true) {
    int temp = clientCount.intValue();
    if(!queue.isEmpty() && clientCount.compareAndSet(temp, temp + 1) { // thread-safe increment 
        process(clients.poll()); // don't forget to decrement the clientCount when the processing finishes
    } else Thread.sleep(500);
}