我需要一些帮助在多线程环境(java 8)中并行运行进程以更快地处理。这是我的用例。
- 从数据库中检索记录(大量,数百万条记录)ex : select * from EMP where .....and MOD(PK,totalLoops -1) =currentLoop LIMIT 10,000(尚未确定限制) – PostgreSQL DB
- 与云平台建立连接,读取 JSON,然后将数据库中的数据验证为 JSON 密钥并返回 tvalidated 与否
- 使用上面检索到的每个记录的验证状态更新数据库。
从数据库中检索记录集并并行运行进程的想法是使用 MOD 值,线程 ID 将替换为“?” 在查询中。Ex MOD (id,ThreadID) = 线程 -1
Q1。问题是,我无法将线程 ID 作为参数传递给 Runnable 或 Callable。Q2。我还可以使用 stream 和 forEach 来调用 ArrayList - process.getGCPDataFromJSON(); 我可以重载这个方法。是否有可能在一个线程内有一个线程和流式传输并有多个线程?
private int totalNumberOfThreads = 10;
Callable<String> callableTask = () -> {
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("Current time :: " + LocalDateTime.now());
for (int i=0; i<10; i++{
process.getGCPDataFromJSON(ArrayList queryDataList =
DataAccess.getInstance().getDataToProcess(i, totalNumberOfThreads));
}
return “Done”
};
//Executor service instance
ExecutorService executor = Executors.newFixedThreadPool(2);
//2. execute individual tasks using submit() method
Set<Callable<String>> callables = new HashSet<Callable<String>>();
for (int i =0; i<10; i++){
executor.submit(callableTask);
callables.add(new Callable<String>() {
@Override
public String call() throws Exception {
return "Task Done:";
}
});
}
String result = executor.invokeAny(callables);
System.out.println("result = " + result);
//Shut down the executor service
executor.shutdownNow();