0

我需要一些帮助在多线程环境(java 8)中并行运行进程以更快地处理。这是我的用例。

  1. 从数据库中检索记录(大量,数百万条记录)ex : select * from EMP where .....and MOD(PK,totalLoops -1) =currentLoop LIMIT 10,000(尚未确定限制) – PostgreSQL DB
  2. 与云平台建立连接,读取 JSON,然后将数据库中的数据验证为 JSON 密钥并返回 tvalidated 与否
  3. 使用上面检索到的每个记录的验证状态更新数据库。

从数据库中检索记录集并并行运行进程的想法是使用 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();
4

0 回答 0