Paw*_*wan 10 java multithreading batch-file
我的Application中有一个连续运行的线程,它由一个HashSet组成,用于存储Application中的所有符号.根据编写时的设计,在Thread的内部,在true条件下,它将连续迭代hashset并为HashSet中包含的所有符号更新数据库.
hashset中可能存在的最大符号大约为6000.我不同时使用所有6000个符号的db,但是将这个hashset分成不同的500个子集(12个集合)并分别执行每个Subset并在每个Subset之后有一个Thread睡眠15分钟,所以我可以减轻压力在数据库上.
这是我的代码,(示例代码段)
我如何将一个Set分区为更小的子集并进行处理,(我已经看到了分配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);
}
}
Run Code Online (Sandbox Code Playgroud)
And*_*hev 46
与番石榴:
for (List<String> partition : Iterables.partition(yourSet, 500)) {
// ... handle partition ...
}
Run Code Online (Sandbox Code Playgroud)
Ami*_*deh 10
做点什么
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);
}
Run Code Online (Sandbox Code Playgroud)
现在您已将其originalSet分为12个其他HashSet.