Java 8和Lambda在关闭钩子中的应用

5

Sonar提到,这个Java代码应该与lambda一起使用,但我从未使用过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
如果executorPool指的是像ThreadPoolExecutor这样的执行器服务,在JVM关闭挂钩中调用shutdown()并没有太多意义,因为shutdown()启动线程池的关闭,它是否有机会在JVM以硬方式杀死所有线程之前完成(或根本没有进展)是不可预测的。并没有任何必要在JVM自动结束线程之前手动结束线程... - Holger
你说得对。如果你使用一个执行器服务,使用shutdownNow更有意义,但我正在使用另一个类,这里的命名可能会让读者产生误解。 - hiaclibe
啊,现在我无法在stackoverflow创建新问题了,因为这个问题被踩了,我的其他问题也没有得到关注…… - hiaclibe
1个回答

22

只需将new Runnable()替换为() ->

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

Runnable 是一个函数式接口,这意味着它只有一个抽象方法,因此它可以被 lambda 表达式替换,这是一种可以作为参数传递的功能。


哇,非常快。谢谢。 - hiaclibe
如果addShutdownHook本身接受一个Runnable实例而不是一个已初始化的线程,或者至少接受一个Supplier lambda来惰性地实例化线程钩子,那就太好了。 - Marcio Carvalho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接