2015-10-26 30 views
3

這是用我未來的代碼片斷未來的任務完成後,沒有放棄。Java進程

import java.util.concurrent.*; 
import java.util.*; 

public class FutureDemo{ 

    public FutureDemo(){ 

      /* Future */ 
      ExecutorService service = Executors.newFixedThreadPool(2); 
      for (int i=0; i<10; i++){ 
        MyCallable myCallable = new MyCallable((long)i); 
        Future<Long> futureResult = service.submit(myCallable); 
        Long result = null; 
        try{ 
          result = futureResult.get(5000, TimeUnit.MILLISECONDS); 
        }catch(TimeoutException e){ 
          System.out.println("Time out after 5 seconds"); 
          futureResult.cancel(true); 
        }catch(InterruptedException ie){ 
          System.out.println("Error: Interrupted"); 
        }catch(ExecutionException ee){ 
          System.out.println("Error: Execution interrupted"); 
        } 
        System.out.println("Result:"+result); 
      } 
    } 

    public static void main(String args[]){ 
      FutureDemo fc = new FutureDemo(); 
    } 

    class MyCallable implements Callable{ 
      Long id = 0L; 

      public MyCallable(Long val){ 
        this.id = val; 
      } 

      public Long call(){ 
        return id; 
      } 
    } 
} 

輸出:

D:\Study\Java>java FutureDemo 
Result:0 
Result:1 
Result:2 
Result:3 
Result:4 
Result:5 
Result:6 
Result:7 
Result:8 
Result:9 
- 

提交所有今後的任務後,我得到的結果,但仍計劃沒有退出。我的光標閃爍,直到我點擊CTRL + C java程序沒有退出。什麼是問題?

編輯:我不能關閉執行程序服務,除非在服務器關閉時觸發關閉掛鉤。

+0

這將執行可調串行:因爲你在循環中調用'get',它會等待,直到結果準備好(或超時或異常),然後提交下一個可調用對象。 –

+0

但我得到了所有在問題中編輯的結果。 –

+0

當然,但它們是按順序排列和執行的。嘗試把在可調用睡眠,使得0將是低於1(比如,4秒如果val == 0睡眠)。你會看到0將在1之前完成。 –

回答

6

需要調用service.shutdown()告訴ExecutorService不等待任何更多的任務。

+0

感謝您的修復。在我的用例中,我無法關閉服務,直到在服務器中觸發關閉掛鉤。 –