【发布时间】:2022-01-17 11:29:34
【问题描述】:
目前我正在开发一个基于报告生成器的应用程序,作为其中的一部分,当用户登录并尝试下载报告时,他最终会调用以下方法作为流程的一部分
执行查询列表以获取所需数据并返回结果。
注意:某些查询可能需要 40-60 分钟才能执行。
现在我确实遇到了一个奇怪的问题,我可以看到有时在触发以下代码后报告永远不会恢复 [通过日志找到观察结果]。
所以我怀疑 Thread.yield() 是否会导致这种情况。由于所有报告调用此代码流具有相同的线程优先级。
我不确定在这个流程中使用 Thread.yield,因为这是一个遗留应用程序,如果这样的代码会导致线程无限等待状态,谁能指导我?
以下是流程的基本伪代码表示,如果需要任何其他信息,请告诉我。提前致谢
Class A {
void m1(reportName) {
try {
// an unique request id gets created for each report generation request
Callable<ReportDownload> = new Download(request, requestid);
FutureTask<ReportDownload> futureTask = new FutureTask<>(download);
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(futureTask);
downloadResponse = futureTask.get();
executorService.shutdown();download
} catch (Throwable drt) {
// logs
} finally {
// does terminal operations
}
}
Class Download {
genrate(reortName) {
List sqllist = // fecth all 3 queries related to connector and store in lis
runQueries(sqllist)
}
// the list sqllist will always have 3 queries and these 3 queries will differ for each and every report
List runQueries(sqllist) {
List list = new ArrayList() // used to store result of each query
for (int i = 0; i != sqllist.size(); ++i) {
Thread.yield();
DBConnection dbconnection = null;
try {
dbconnection = // creates db connection
String query = sqllist.get(i);
/* uses DB connection pool and exectes query and store result
* someting like as shown below
*/ And there is no issue with query or dbconnection
DBResult DBResult= dbconnection.retrieve(sql);
// proces returnes result and store in list.
list.add(DBResult);
}
catch (SQLException e) {
// log sql exception
}
}
return list;
}
```
【问题讨论】:
-
是的 @Abra 它正在实现 Callable 我刚刚编写了一种伪代码来给出代码流的整体表示。
-
好的,确定@Abra 已在描述中将其添加为伪代码。我对代码的主要怀疑是“Thread.yield();”所以只需添加与其相关的代码而不是添加完整的类
-
@tevemadar 谢谢你的参考非常有价值。
标签: java multithreading