Nếu bạn chỉ muốn sử dụng nó ở một nơi, thì bạn có thể nội dòng java.util.concurrent.ThreadFactory
triển khai, ví dụ: đối với một nhóm có 4 luồng bạn sẽ viết (ví dụ được hiển thị dưới dạng lambda giả sử Java 1.8 hoặc mới hơn):
ExecutorService pool = Executors.newFixedThreadPool(4,
(Runnable r) -> {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
);
Nhưng tôi thường muốn tất cả các nhà máy Thread của mình tạo ra các luồng daemon, vì vậy tôi thêm một lớp tiện ích như sau:
import java.util.concurrent.ThreadFactory;
public class DaemonThreadFactory implements ThreadFactory {
public final static ThreadFactory instance =
new DaemonThreadFactory();
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
}
Điều đó cho phép tôi dễ dàng chuyển DaemonThreadFactory.instance
đến ExecutorService
, ví dụ:
ExecutorService pool = Executors.newFixedThreadPool(
4, DaemonThreadFactory.instance
);
hoặc sử dụng nó để dễ dàng bắt đầu một Thread daemon từ một Runnable
, ví dụ:
DaemonThreadFactory.instance.newThread(
() -> { doSomething(); }
).start();