2013-04-26 28 views

回答

38

它没有。为什么呢?除非你告诉它。

例如,在Callable的情况下,这里有一个非常有效的问题。如果你等待20秒的结果而你没有得到结果,那么你对结果不再感兴趣。那时你应该完全取消这项任务。

事情是这样的:

Future<?> future = service.submit(new MyCallable()); 
    try { 
     future.get(100, TimeUnit.MILLISECONDS); 
    } catch (Exception e){ 
     e.printStackTrace(); 
     future.cancel(true); //this method will stop the running underlying task 
    } 
+13

只是一个注释:'future.cancel(true);'不**停止正在运行的底层任务,它只是将正在运行的线程的中断标志设置为true。它是你的代码负责检查这个标志并且如果它是真的,就抛出InterruptedException。 – 2015-03-31 17:09:03

+0

@ThiagoKronig,你确定吗?从[documentation](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(boolean)),如果您传递true,则应该中断该线程并且尝试应该失败。 – Dirk 2015-07-27 18:54:22

+7

@Dirk,来自我们的文档:_如果任务已经启动,那么mayInterruptIfRunning参数确定执行此task_ **的线程是否应该被中断以试图停止任务**。 _Interruption_这里意味着它将设置为真,该线程的易失性标志。运行的代码必须测试这种情况才能够自行停止。代码必须自行停止。 – 2015-07-28 14:54:22

14

不,它不。 Morover甚至没有试图中断任务。首先Future.get超时并不这么说。其次,试试我的测试,看看它是如何表现在1秒

ExecutorService ex = Executors.newSingleThreadExecutor(); 
    Future<?> f = ex.submit(new Runnable() { 
     public void run() { 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("finished"); 
     } 
    }); 
    f.get(1, TimeUnit.SECONDS); 

它打印

Exception in thread "main" java.util.concurrent.TimeoutException 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:91) 
    at Test1.main(Test1.java:23) 

陆续1秒任务successfullt完成

finished 
+1

嗯...那个*特别*'Future'实现没有。因为它是一个界面,所以不能对所有“未来”做详尽的陈述。 – 2013-04-26 08:11:18

+6

Future.get(长时间超时,TimeUnit单位)不会说它会尝试停止任务。此外,有很多方法可以阻止正在运行的线程? – 2013-04-26 08:14:15

+0

好的回应,我收回我的投诉! – 2013-04-26 08:15:39