有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程处理多个rest调用

我正在尝试使用以下代码处理大约1000个文件:

ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
Runnable worker = null;
for (File file : files) {
    if (file.isFile()) {
        worker = new FileProcessThread(file, connectionVo);
        executor.execute(worker);
        file.deleteOnExit();
    }
}
while (!executor.isTerminated()) {
    System.out.println("Still running");
}
executor.shutdown();
System.out.println("Finished all threads");

此代码创建多个线程。每个线程内部都有多个rest调用。 这些RESTAPI用于处理输入文件。每个线程还记录处理过程中发生的每个事务事件。 但这些线程执行的结果并不一致

  1. 对于少数线程,它工作得非常好。选择文件。日志正确
    事务并将处理过的文件移动到适当的目录
  2. 但对于某些线程,它会显示一些不可预测的行为,例如将一个线程的文件进程事件记录到另一个线程中

每个线程中的步骤:

  1. 创建事务-rest调用
  2. 在事务中记录进程启动-rest调用的事件
  3. 将文件提供给其他模块进行文件转换-rest调用,该调用在内部进行
    创建一个或多个已同步的线程
  4. 一旦文件被处理,它就会被移动到另一个-在同一个代码目录中

我希望这些线程具有一致的性能。任何帮助都将不胜感激

运行内部代码:

 long transactionID = 0l;
    long connectionId = connectionVo.getConnectionId();
    try {
        transactionID = beginTransaction.getTransactionId();
        FileInputStream processedFileData;
        processedFileData = new FileInputStream(file);

        Response response = Service.postMessage(stream2file,              
        connectionId, 0, transactionID);

        if (response.getStatus() != 200) {
              writToDirectory(stream2file, userError, file.getName(), transactionID);
            }

        } else {
            String userArchive = getUserArchive();
            if (checkDirectory(userArchive, transactionID)) {
                writToDirectory(stream2file, userArchive, file.getName(), transactionID);
            }

        }
        file.delete();

    } catch (FileNotFoundException e) {
    } 

共 (1) 个答案

  1. # 1 楼答案

    我建议您使用Java8来执行多线程,因为它更干净

    files.parallelStream()
         .filter(File::isFile)
         .forEach(f -> new FileProcessThread(file, connectionVo).run());
    

    任务成功完成后将删除该文件

    这将只将每个文件传递给一个任务

    顺便说一句,除非任务实际上是一个线程,否则不要调用它们xxxThread,并避免对线程进行子分类