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

div*_*gon 2 java multithreading

如何将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 + "";
    }
}
Run Code Online (Sandbox Code Playgroud)

主要计划

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我之前关于Java中悬空线程的问题我要理解的是,我必须将我的线程作为守护线程.

Gra*_*ray 7

如何将Callable线程作为守护线程?

您需要使用新的ThreadFactory创建守护程序线程.在这里看到这个答案:Java中的Executor和Daemon

默认情况下,执行程序在构建池时会创建非守护程序线程.但是你可以注入自己的ThreadFactory,为池创建线程.

例如:

executor = ExecutorService.newSingleThreadExecutor(new MyThreadFactory());
Run Code Online (Sandbox Code Playgroud)

ThreadFactory工具的newThread方法:

Thread newThread(Runnable r)
Run Code Online (Sandbox Code Playgroud)

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

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

你在问题中提到过:

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

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