将一个集分区为较小的子集,并作为批处理进行处理

2022-09-02 02:07:00

我的应用程序中有一个连续运行的线程,它由一个哈希集组成,用于存储应用程序内的所有符号。根据编写时的设计,在线程的 while true 条件内,它将持续迭代 HashSet,并更新数据库中包含的所有符号。

哈希集中可能存在的最大符号数约为 6000 个。我不想一次用所有6000个符号更新数据库,而是将此HashSet划分为500个(12组)的不同子集,并单独执行每个子集,并在每个子集之后有一个线程休眠15分钟,这样我就可以减轻数据库的压力。

这是我的代码(示例代码片段)

如何将一个集合分区为较小的子集和进程(我已经看过对ArrayList,TreeSet进行分区的示例,但没有找到任何与HashSet相关的示例)

package com.ubsc.rewji.threads;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue;

public class TaskerThread extends Thread {
    private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
    String symbols[] = new String[] { "One", "Two", "Three", "Four" };
    Set<String> allSymbolsSet = Collections
            .synchronizedSet(new HashSet<String>(Arrays.asList(symbols)));

    public void addsymbols(String commaDelimSymbolsList) {
        if (commaDelimSymbolsList != null) {
            String[] symAr = commaDelimSymbolsList.split(",");
            for (int i = 0; i < symAr.length; i++) {
                priorityBlocking.add(symAr[i]);
            }
        }
    }

    public void run() {
        while (true) {
            try {
                while (priorityBlocking.peek() != null) {
                    String symbol = priorityBlocking.poll();
                    allSymbolsSet.add(symbol);
                }
                Iterator<String> ite = allSymbolsSet.iterator();
                System.out.println("=======================");
                while (ite.hasNext()) {
                    String symbol = ite.next();
                    if (symbol != null && symbol.trim().length() > 0) {
                        try {
                            updateDB(symbol);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void updateDB(String symbol) {
        System.out.println("THE SYMBOL BEING UPDATED IS" + "  " + symbol);
    }

    public static void main(String args[]) {
        TaskerThread taskThread = new TaskerThread();
        taskThread.start();

        String commaDelimSymbolsList = "ONVO,HJI,HYU,SD,F,SDF,ASA,TRET,TRE,JHG,RWE,XCX,WQE,KLJK,XCZ";
        taskThread.addsymbols(commaDelimSymbolsList);

    }

}

答案 1

番石榴

for (List<String> partition : Iterables.partition(yourSet, 500)) {
    // ... handle partition ...
}

Apache Commons

for (List<String> partition : ListUtils.partition(yourList, 500)) {
    // ... handle partition ...
}

答案 2

执行类似操作

private static final int PARTITIONS_COUNT = 12;

List<Set<Type>> theSets = new ArrayList<Set<Type>>(PARTITIONS_COUNT);
for (int i = 0; i < PARTITIONS_COUNT; i++) {
    theSets.add(new HashSet<Type>());
}

int index = 0;
for (Type object : originalSet) {
    theSets.get(index++ % PARTITIONS_COUNT).add(object);
}

现在,您已将 分为 12 个其他 HashSet。originalSet