【发布时间】:2021-09-22 00:50:48
【问题描述】:
我有一个异步方法,每次调用 api 端点时都会启动一个新线程来执行一些幕后处理。
我有一个缓冲读取器,它从进程中获取 inputStream 以获取特定行并将其写入磁盘上的文件。但是我认为我正在处理一些并发问题,因为有些文件是空的。这是我的示例代码:
@Async
public void runTaskAsync(String jobIDString) {
Runtime runtime = Runtime.getRuntime();
String line;
String summary = "";
try {
Process gradlewProcess = runtime.exec( SOME PROCESS );
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gradlewProcess.getInputStream()));
while ((line = bufferedReader.readLine()) != null) {
if(line WE ARE LOOKING FOR) {
summary = line
break;
}
}
//Write the summary to a txt file
PrintWriter summaryWriter = new PrintWriter(FILE NAME);
summaryWriter.println(summary);
summaryWriter.close();
//Create the tar file
runtime.exec(TAR SOME FOLDER);
runtime.exec(MOVE TAR FILE TO ANOTHER FOLDER);
}
.
.
.
在某些情况下,TAR 文件不会移动到文件夹中(当多个线程同时运行时)。我假设这是由于 IO 并发造成的,但不确定解决此问题的最佳方法。
如何从进程输出中获取特定行并将其存储到诸如此类的多线程场景中的文件中?
【问题讨论】:
-
文件将为空,因为输入流不包含任何“我们正在寻找的行”。明显地。 --- 仅供参考:您忘记关闭输入流。
-
您正在线程中本地创建资源,因此您正在处理的线程问题极不可能。看起来您并没有等待
Process对象完成,可能在应用程序第一次输出之前停止读取。 -
你可以查看这个例子,它使用完整的未来在一个大文件上异步创建任务链。 thetechnojournals.com/2019/10/…
标签: java multithreading asynchronous concurrency