2012-07-06 35 views
1

我想调用一个java中由于某种原因阻塞的方法。我想等待X分钟的方法,然后我想停止该方法。在java中调用超时的阻塞方法调用

我在StackOverflow上读到了一个解决方案,它给了我一个第一个快速入门。我写在这里: -

ExecutorService executor = Executors.newCachedThreadPool(); 
    Callable<Object> task = new Callable<Object>() { 
     public Object call() { 
      return something.blockingMethod(); 
     } 
    }; 
    Future<Object> future = executor.submit(task); 
    try { 
     Object result = future.get(5, TimeUnit.SECONDS); 
    } catch (TimeoutException ex) { 
     // handle the timeout 
    } catch (InterruptedException e) { 
     // handle the interrupts 
    } catch (ExecutionException e) { 
     // handle other exceptions 
    } finally { 
     future.cancel(); // may or may not desire this 
    } 

但现在我的问题是,我的函数可以抛出一些异常,我必须赶上并相应地做一些工作。因此,如果在代码中的功能blockingMethod()thorws一些异常如何在外部类中捕获它们?

+0

我会在动物课上接受它。这样就不会有例外。 – 2012-07-06 13:15:08

+0

另外,不要明确地捕获每个检查的异常,因为你可能不会写任何特定的处理代码。只要写'catch(RuntimeException e){throw e; } catch(Exception e){抛出新的RuntimeException(e); }' – 2012-07-06 13:24:46

+0

是的,早些时候我认为同样的事情,我会这样做,但有很多外部类的变量,我想在异常处理代码中使用。而且我无法访问Inner类中的这些变量。 – 2012-07-06 13:32:32

回答

4

您已将所有设置设置为在您提供的代码中执行此操作。只需替换

// handle other exceptions 

与您的异常处理。
如果你需要得到您的具体Exception你得到它:

Throwable t = e.getCause(); 

而且你的例外区分,你可以这样做:

if (t instanceof MyException1) { 
    ... 
} else if (t instanceof MyException2) { 
    ... 
... 
+0

啊好的!谢谢:) 这将解决这个问题,我猜! – 2012-07-06 13:19:11

+0

我不知道我会那样做肯定:) 只是还有一个问题,如果我有不同类型的例外例 MyException1,MyException2和我根据不同的Exception有不同的处理。如何区分多个异常? – 2012-07-06 13:28:29

+0

编辑也添加该信息。 – Keppil 2012-07-06 13:33:00

-1

了Thread.Sleep(X millisecods)将停止线程x毫秒,那么它就会恢复。另一种方式是调用thread.wait(x)(x的超时值),然后调用thread.notify()来唤醒睡眠线程。