将可调用线程设为守护进程

2023-11-29

如何将 Callable 线程设置为守护线程?

这就是我正在尝试的。我正在尝试执行一组线程,其中一个线程未完成并进入无限循环。它的作用是即使所有代码语句都被执行,程序的主线程也不会终止。之后主线程进入挂起模式。

这是相同的代码片段。

public class MyThread implements Callable<String> {

    private int value;

    public MyThread(int value) {
        this.value = value;
    }

    @Override
    public String call() throws Exception {

        //Thread.currentThread().setDaemon(true);

        System.out.println("Executing - " + value);

        if (value == 4) {
            for (; ; );
        }

        return value + "";
    }
}

主程序

public class ExecutorMain {

    public static String testing() {    
        ExecutorService executor = null;
        List<Future<String>> result = null;
        String parsedValue = null;
        try {
            executor = Executors.newSingleThreadExecutor();

            List<MyThread> threads = new ArrayList<MyThread>();

            for (int i = 1; i < 10; i++) {
                MyThread obj = new MyThread(i);
                threads.add(obj);
            }

            result = executor.invokeAll(threads, Long.valueOf("4000"), TimeUnit.MILLISECONDS);
            //result = executor.invokeAll(threads);

            for (Future<String> f : result) {
                try {
                    parsedValue = f.get();
                    System.out.println("Return Value - " + parsedValue);
                } catch (CancellationException e) {
                    System.out.println("Cancelled");
                    parsedValue = "";
                    f.cancel(true);
                }
            }

            executor.shutdownNow();
        } catch (Exception e) {
            System.out.println("Exception while running threads");
            e.printStackTrace();
        } finally {
            List executedThreads = executor.shutdownNow();

            System.out.println(executedThreads);

            for (Object o : executedThreads) {
                System.out.println(o.getClass());
            }
        }
        System.out.println("Exiting....");
        //System.exit(1);

        return "";
    }

    public static void main(String[] args) {
        testing();
    }
}

我从之前的问题中了解到什么Java 中的悬空线程是我必须将我的线程设置为守护线程。


如何将 Callable 线程设置为守护线程?

您需要使用新的ThreadFactory创建守护线程。在这里查看这个答案:Java 中的执行器和守护进程

默认情况下,执行器在构建池时都会创建非守护线程。但你可以自己注入ThreadFactory它为池创建线程。

例如:

executor = ExecutorService.newSingleThreadExecutor(new MyThreadFactory());

The ThreadFactory实施newThread method:

Thread newThread(Runnable r)

从我上面链接的答案中复制,您可以像这样实现它:

class MyThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setDaemon(true);
        return thread;
    }
}

您在问题中提到:

//Thread.currentThread().setDaemon(true);

是的,这不起作用,因为一旦线程启动,您就无法设置守护进程标志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将可调用线程设为守护进程 的相关文章

随机推荐

  • 如何在VS2013中隐藏引用计数?

    Visual Studio 2013 引入了一项新功能 它可以显示每种方法的使用次数 我觉得它不是很有用 而且它弄乱了我的文件间距 我如何禁用它 似乎找不到这个选项 我猜您可能正在运行 VS2013 Ultimate 的预览版 因为它没有出
  • 将 *array 分配给指针

    以下内容摘自Harbinson Steele C 参考手册 第五版 根据书中的两个作业p是等价的 7 5 6 地址运算符 int a 10 p p a p a 然而 根据 C faq问题 6 12 a是指针类型int然而 a是指向数组的指针
  • 无法将 macOS-arm64 的库与 macOS-arm64 的可执行文件链接

    I have some trouble with creating a build system on a Monterey M1 MacBook 到目前为止 我有一个可用的 Makefile 来构建和链接库 简化 g c所有 cpp 文件
  • Android NDK 中的 ICU 库

    我正在尝试为依赖于 ICU 库 libicuuc so 和 libicui18n so 的 C 库创建 JNI 包装器 我尝试在 NDK 标准版本和 CrystaX 版本 在 Mac OS X 机器上 中构建 ICU4C 并不断遇到如下链接
  • 从 Android Activity 调用 javascript 函数

    我在主活动中使用以下代码 其给出的函数 display 未定义 public class cordovaExample extends DroidGap Context mcontext private novel n private Se
  • Spring + Hibernate +JTA - HibernateTransactionManager 或 JTATransactionManager

    我要整合Spring and 休眠并使用JTA用于管理交易 我还想将事务处理委托给应用程序服务器 在我的例子中是 JBoss 我对 的配置有疑问事务管理器 春天的豆子 1 我们可以使用Hibernate事务管理器并设置属性hibernate
  • 设计一个仅适用于 Android 平板电脑的应用程序 [重复]

    这个问题在这里已经有答案了 假设我想构建 2 组不同的仅限平板电脑的布局 一台适用于 600dp 7 英寸平板电脑 1024x600 一台适用于 720dp 10 英寸平板电脑 1280x720 或 1280x800 据我所知 在 andr
  • 无法上传图像(HttpPostedFileBase 为 Null)

    我尝试使用图像上传器 但是当我单击浏览并选择图像然后提交表单时 HttpPostedFileBase 为空 我的实施有遗漏吗 请帮忙 View
  • 如何解决共享 Google Apps 脚本库的“此应用程序被阻止”错误?

    我正在尝试创建一个可以在 Google 表格电子表格中重复使用的 Google Apps 脚本 GAS 库 下列的这些说明 这是我到目前为止所做的 创建了一个新项目谷歌云平台 在步骤 1 中为项目启用 Google Sheets API 在
  • 用户卸载 Android 应用程序时的通知

    当用户从他 她的 Android 设备卸载我的应用程序时 有没有办法收到通知 不 您可以使用 PACKAGE REMOVED 广播接收器获取其他应用程序卸载事件 但不能获取应用程序本身卸载的事件 因为它已被删除 请参阅文档here
  • 如何更新正在运行的 EXE?

    如何用新版本替换正在运行的 EXE 你能行的this way 重命名正在运行的 EXE 将新版本复制到旧名称 当新版本启动时删除重命名的EXE 请注意 这绝对是不推荐的行为
  • Javascript 从单独的 php 脚本获取输出

    我希望 javascript 能够使用 jQuery 调用 php 脚本 它只是回显一个字符串 I think get是正确的方法 但不太确定 然后我想使用返回的字符串作为 JavaScript 变量 get 确实是可行的方法 首先 您需要
  • 如何使用 .NET 4 将自定义属性添加到 Word 文档?

    使用 NET 4 如何向文档添加自定义属性 我假设事情是这样的 WordApp an instance of Microsoft Office Interop Word Application ActiveDocument CustomDo
  • Python:Pandas Dataframe 如何将整列与标量相乘

    如何将数据帧给定列的每个元素与标量相乘 我尝试过寻找SO 但似乎找不到正确的解决方案 做类似的事情 df quantity 1 trying to multiply each row s quantity column with 1 给我一
  • 如何通过 JNDI 检索 LDAP 密码

    我可以通过 JNDI 读取 LDAP 中存储的密码 但结果是一些乱码字符 那么我该如何解密呢 下面是我的代码 public static void main String args String INITCTX com sun jndi l
  • 如何在 BASH 中将 csv 文件读入二维数组?

    如何在 BASH 中将 csv 文件读入二维数组 该脚本需要足够动态 可以获取行数和列数可变的 csv 文件 例如 如果我有一个 csv 文件 如下所示 AVERAGE STDEV MAX 17 18 19 or AVERAGE STDEV
  • 文件下载后执行页面导航并发送重定向

    我需要找到一种在生成文件下载后执行页面导航的方法 到目前为止 我已经准备好文件下载并开始工作 FileInputStream stream new FileInputStream file FacesContext fc FacesCont
  • python 正则表达式仅匹配最后一次出现

    我在为重复字符串模式实现正则表达式时遇到一些问题 gt gt gt re findall w d a b c d e f e f 我也想购买其他物品 非常感谢帮助 去除 你的模式匹配all出现次数 但该组只能捕获一次出现情况 您不能以这种方
  • 无法在自定义 SurfaceView 类之上进行绘制

    我用过示例指南创建一个名为 CameraPreview 的类 该类继承自 SurfaceView 类 并显示相机预览 我还创建了另一个名为 DrawOnTop 的自定义视图类 它直接从 View 继承 我用它来在预览顶部绘制文本和其他项目
  • 将可调用线程设为守护进程

    如何将 Callable 线程设置为守护线程 这就是我正在尝试的 我正在尝试执行一组线程 其中一个线程未完成并进入无限循环 它的作用是即使所有代码语句都被执行 程序的主线程也不会终止 之后主线程进入挂起模式 这是相同的代码片段 public