假设我有10,000个对象的列表
ArrayList<String> al=new ArrayList<String>();
al.add("1");
al.add("2");
al.add("..");
al.add("10000");
我想使用具有20个线程的线程池来处理10,000个对象。目标是确保我的程序一次准确地读取每个对象。
由于程序将不会标记已读取列表对象,因此我保证每个对象只能被处理一次吗?。
答案 0 :(得分:0)
我有一个主意,也许确实很愚蠢。由于您仅尝试读取列表中的对象,因此如果应用此策略该怎么办。
在另一种方法中,您可以做的是,创建一个同步集,每次选择一个元素时,检查索引是否存在于集合中,如果不存在,则选择该元素并将其索引插入到索引中。组。这样,您将不会两次选择元素。
答案 1 :(得分:0)
您可以使用以下代码:
ExecutorService executorService = Executors.newFixedThreadPool(20);
executorService.execute(new Runnable() {
public void run() {
//add item in here and remember using sync data
}
});
executorService.shutdown();
答案 2 :(得分:0)
将列表分为20部分:
Map<Integer, List<String>> mapList = al.stream().collect(Collectors.groupingBy(i -> i.hashCode() % 20));