执行人服务,返回类型无效

时间:2019-02-06 11:57:44

标签: runnable executorservice java-threads callable

在这里,我想调用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();

请建议我使用正确的代码进行修改?预先感谢

1 个答案:

答案 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)