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用于处理输入文件。每个线程还记录处理过程中发生的每个事务事件。 但这些线程执行的结果并不一致
- 对于少数线程,它工作得非常好。选择文件。日志正确
事务并将处理过的文件移动到适当的目录李> - 但对于某些线程,它会显示一些不可预测的行为,例如将一个线程的文件进程事件记录到另一个线程中李>
每个线程中的步骤:
- 创建事务-rest调用
- 在事务中记录进程启动-rest调用的事件
- 将文件提供给其他模块进行文件转换-rest调用,该调用在内部进行
创建一个或多个已同步的线程 - 一旦文件被处理,它就会被移动到另一个-在同一个代码目录中
我希望这些线程具有一致的性能。任何帮助都将不胜感激
运行内部代码:
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 楼答案
我建议您使用Java8来执行多线程,因为它更干净
任务成功完成后将删除该文件
这将只将每个文件传递给一个任务
顺便说一句,除非任务实际上是一个线程,否则不要调用它们
xxxThread
,并避免对线程进行子分类