在这里,我想调用n
线程并执行我的函数padrDao.saveGuidanceDetails(sgd)
,这是一个执行插入操作并返回长值的DAO方法,如下面的代码所示。
我正在使用Callable,但是它要求我返回一些值,但是我不熟悉将Runnable
用于同一作业的线程。有人可以验证代码是否正确或要进行任何修改吗?我觉得代码是错误的,因为在callable内有一个return语句,这会使我无法执行第一个任务本身的主要方法。
int totalThreadsNeeded=listForguidanceItems.size();
ExecutorService executor = Executors.newFixedThreadPool(totalThreadsNeeded);
List<Callable<Void>> runnableTasks = new ArrayList<>();
final PriceLineItemsResultExt response1=response;
for(final ProductLineItemResultExt item: listForguidanceItems)
{
int counter=0;
final SavedGuidanceDetailsDto sgd=list.get(counter);
Callable<Void> task1 = new Callable() {
public Void call() {
if (sgd.hasGuidance())
{
if (response1.isSaveGuidance()) {
long guidanceDetailsId = padrDao.saveGuidanceDetails(sgd);
item.setGuidanceDetailsId(String.valueOf(guidanceDetailsId));
}
}
return null;
}};
counter++;
runnableTasks.add(task1);
}
try {
executor.invokeAll(runnableTasks);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.info("Thread fail exception " + e);
}
executor.shutdown();
请建议我使用正确的代码进行修改?预先感谢
答案 0 :(得分:0)
要使用Runnable,您只需替换以下内容即可:
Callable<Void> task1 = new Callable() {
public Void call() {
...
使用
Runnable task1 = new Runnable {
public void run() {
...
有了runnable,您就不必返回任何东西。
当然,如果您仍然想将它们存储在“集合”中(可能不是),还需要将runnableTasks
修改为List<Runnable>
,并更改在其中提交它们的方式ExecutorService为:
executor.submit(your_Runnable_object)