2016-06-08 84 views
0

Sonar提到,這個java代碼應該和lambda一起使用,但我從來沒有用過lamdas,也不知道如何使用它。有人能指出我的代碼的正確版本:?Java 8和lambda在關機鉤

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

    @Override 
    public void run() { 
     closeable.close(); 
     logger.info("Close closeable."); 
     executorPool.shutdown(); 
     logger.info("Shutdown executorPool"); 
    } 
})); 
+1

然後請參閱lambda教程:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html – Tunaki

+2

如果「e xecutorPool'指的是像ThreadPoolExecutor這樣的執行器服務,它在JVM關閉鉤子內調用'shutdown()'並沒有太大意義,因爲'shutdown()'只有*啓動*關閉了線程池,無論它是否曾經有機會完成(或者完全取得進展),之後JVM將難以完成所有線程,這是不可預測的。並不是說需要在JVM自動結束之前手動結束線程... – Holger

+0

你是對的。如果您使用執行器服務,使用shutdownNow會更有意義,但是我正在使用另一個類,並且這裏的命名可能會誤導讀者。 – hiaclibe

回答

5

只是() ->

Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
    closeable.close(); 
    logger.info("Close closeable."); 
    executorPool.shutdown(); 
    logger.info("Shutdown executorPool"); 
})); 

可運行更換new Runnable()是一個功能接口,這意味着它只有一個抽象方法,因此它可以用一個lambda表達,這是有點功能來代替可以作爲參數傳遞

+0

哇非常快。謝謝。 – hiaclibe