用于处理多个休息调用的线程

时间:2016-01-12 09:02:06

标签: java multithreading rest java-threads

我正在尝试使用以下代码处理大约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");

此代码创建多个线程。每个线程内部都有多个休息调用。 其余api用于处理输入文件。每个线程还记录处理时发生的每个事务事件。 但是这些线程执行的结果并不一致。

  1. 对于少数线程,它完全正常。选择文件。记录正确
    事务并将处理过的文件移动到正确的目录。
  2. 但是对于某些线程,它显示了一些不可预测的行为,例如它将一个线程的文件进程事件记录到其他线程中。
  3. 每个帖子中的步骤:

    1. 创建交易 - 休息电话
    2. 在流程中记录事件以进行流程启动 - 休息呼叫
    3. 将文件提供给其他模块进行文件转换 - 内部的休息呼叫                                                 创建另一个同步的线程
    4. 处理完文件后,会将其移至其他位置 - 在同一代码目录中
    5. 我想从这些线程中获得一致的性能。任何帮助将不胜感激。

      运行中的代码:

       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 个答案:

答案 0 :(得分:1)

我建议您使用Java 8来执行多线程,因为它更清晰。

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

成功完成后,您的任务将删除该文件。

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

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