当前位置: 首页 > 面试题库 >

将ExecutorService转换为Java中的守护程序

冀啸
2023-03-14
问题内容

我正在Java 1.6中使用ExecutoreService,其启动方式仅由

ExecutorService pool = Executors.newFixedThreadPool(THREADS).

当我的主线程完成时(以及线程池处理的所有任务),该池将阻止我的程序关闭,直到我显式调用

pool.shutdown();

我是否可以通过以某种方式将此池使用的内部线程管理转换为守护线程来避免调用此方法?还是我在这里想念什么。


问题答案:

Marco13的答案可能是最简单,首选的解决方案,因此不要被投票分歧(我的答案比以前大几岁)或验收标记所欺骗(这意味着我的解决方案适用于OP环境,而不是最好的)。

您可以ThreadFactory用来将Executor中的线程设置为守护程序。这将以某种方式影响执行程序服务,该服务也将成为守护程序线程,因此,如果没有其他非守护程序线程,它将(以及它所处理的线程)停止。这是简单的示例:

ExecutorService exec = Executors.newFixedThreadPool(4,
        new ThreadFactory() {
            public Thread newThread(Runnable r) {
                Thread t = Executors.defaultThreadFactory().newThread(r);
                t.setDaemon(true);
                return t;
            }
        });

exec.execute(YourTaskNowWillBeDaemon);

但是,如果您想让执行程序完成任务的执行程序,并同时shutdown()在应用程序完成时自动调用其方法,则可能需要用Guava
包装您的执行程序MoreExecutors.getExitingExecutorService

ExecutorService exec = MoreExecutors.getExitingExecutorService(
        (ThreadPoolExecutor) Executors.newFixedThreadPool(4), 
        100_000, TimeUnit.DAYS//period after which executor will be automatically closed
                             //I assume that 100_000 days is enough to simulate infinity
);
//exec.execute(YourTask);
exec.execute(() -> {
    for (int i = 0; i < 3; i++) {
        System.out.println("daemon");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});


 类似资料:
  • 问题内容: 我编写了一个程序,现在希望将其转换为守护程序。由于我是菜鸟,对此一无所知,请您告诉我该怎么做,还是请给我一些基本的教程或相关阅读材料?我真的很想学习如何做? 谢谢你们 问题答案: Java类: Shell启动/停止脚本: 效果:

  • 问题内容: 我正在做Java试卷,并且遇到了以下使我感到困惑的问题。 以下哪项是正确的?(选择所有适用项。) 答:当应用程序开始运行时,会有一个守护线程,其任务是执行main()。 B.当一个应用程序开始运行时,有一个非守护进程线程,其工作是执行main()。 C.由守护程序线程创建的线程最初也是守护程序线程。 D.由非守护程序线程创建的线程最初也是非守护程序线程。 关键答案是B,C,D,谁能告诉

  • 主要内容:1 什么是Java 守护线程,2 Java 守护线程的要点,3 Thread类的守护线程方法,3 Java 守护线程的例子1 什么是Java 守护线程 Java中的守护程序线程是一个服务提供者线程,向用户线程提供服务。它的寿命受到用户线程的控制,即当所有用户线程死亡时,JVM会自动终止该线程。 有许多自动运行的Java守护程序线程,例如gc,finalizer等。 您可以通过在cmd命令提示符下键入来查看所有详细信息。jconsole工具提供有关已加载类,内存使用情况,正在运行的线程等

  • 本文向大家介绍浅谈java的守护线程与非守护线程,包括了浅谈java的守护线程与非守护线程的使用技巧和注意事项,需要的朋友参考一下 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) ,(PS:以前忽略了)。 估计学过Unix开发但是没有细致学习Java的同学们会

  • 问题内容: 我编写了一个程序,可通过深度优先搜索解决迷宫问题。我想知道如何将该Java程序转换为Screensaver应用程序?通常可以激活屏幕保护程序时,Windows 7是否可以启动我的应用程序? 问题答案: Windows屏幕保护程序只是接受某些命令行参数的程序。因此,为了使您的程序可以作为屏幕保护程序运行,您必须对其进行编码以接受这些参数。 接下来,您可能希望屏幕保护程序以全屏模式运行。这

  • 本文向大家介绍python实现守护进程、守护线程、守护非守护并行,包括了python实现守护进程、守护线程、守护非守护并行的使用技巧和注意事项,需要的朋友参考一下 守护进程 1、守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allow