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中悬空线程的问题我要理解的是,我必须将我的线程作为守护线程.
如何将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);
是的,这不起作用,因为一旦线程启动就无法设置守护进程标志.
| 归档时间: |
|
| 查看次数: |
4304 次 |
| 最近记录: |