1

我正在使用 ThreadPool Executor,并使用 invokeAll() 方法调用任务。在可调用的 call() 方法中,我写入数据库,但如果我确定线程执行良好并且没有严重终止,我只想写。

这些解决方案中的任何一个是否有效:

解决方案 1

我认为这不起作用,因为线程可以在数据库写入后被中断,所以它不会返回结果,我猜。

public Result call() throws exception(){

    ...

    if( !Thread.currentThread.isInterrupted() ){
       //Save to the database
    } 

    ...

    return result;
}

解决方案 2

处理 get() 方法之后的写入,以确保它很好地终止,如果我理解正确,get() 方法会重新抛出执行期间捕获的任何异常

...

for( Future f : futures){

   try {

       Result r = f.get();

       //Do the write with the result i got
   }
   catch( Exception e){
     //Something went wrong
   }

}

提前致谢。

4

1 回答 1

0

在可调用的 call() 方法中,我写入数据库...

在这种情况下,异常处理逻辑需要在call()方法本身中;例如

public Result call() {
    try {
       ...
       if (!Thread.currentThread.isInterrupted()) {
          // Save to the database
          return result;
       } else {
          return // some result that means interrupted.
       }
    catch (Exception ex) {
       return // some result that means failed.
    }
}

尝试让主线程进行数据库保存似乎没有任何意义。

于 2013-09-08T03:42:17.560 回答