有人能告诉我Java中的守护线程是什么吗?
当前回答
Java中的守护线程是指运行在后台的线程,主要由JVM创建,用于执行后台任务,如垃圾收集和其他家政任务。
注意事项:
Any thread created by main thread, which runs main method in Java is by default non daemon because Thread inherits its daemon nature from the Thread which creates it i.e. parent Thread and since main thread is a non daemon thread, any other thread created from it will remain non-daemon until explicitly made daemon by calling setDaemon(true). Thread.setDaemon(true) makes a Thread daemon but it can only be called before starting Thread in Java. It will throw IllegalThreadStateException if corresponding Thread is already started and running.
Java中守护线程与非守护线程的区别:
1) JVM在存在之前不会等待任何守护线程完成。
2)当JVM终止时,守护线程与用户线程被区别对待,最终块不被调用,堆栈不受伤,JVM只是退出。
其他回答
以上答案都是好的。下面是一个简单的小代码片段,以说明两者的区别。在setDaemon中分别尝试true和false值。
public class DaemonTest {
public static void main(String[] args) {
new WorkerThread().start();
try {
Thread.sleep(7500);
} catch (InterruptedException e) {
// handle here exception
}
System.out.println("Main Thread ending") ;
}
}
class WorkerThread extends Thread {
public WorkerThread() {
// When false, (i.e. when it's a non daemon thread),
// the WorkerThread continues to run.
// When true, (i.e. when it's a daemon thread),
// the WorkerThread terminates when the main
// thread or/and user defined thread(non daemon) terminates.
setDaemon(true);
}
public void run() {
int count = 0;
while (true) {
System.out.println("Hello from Worker "+count++);
try {
sleep(5000);
} catch (InterruptedException e) {
// handle exception here
}
}
}
}
守护线程是在程序完成但线程仍在运行时不阻止JVM退出的线程。守护进程线程的一个例子是垃圾收集。
您可以使用setDaemon(boolean)方法在线程启动之前更改线程守护进程属性。
守护进程线程通常被称为“服务提供者”线程。这些线程不应该用来执行程序代码,而应该用来执行系统代码。这些线程与您的代码并行运行,但JVM可以随时终止它们。当JVM没有发现用户线程时,它将停止用户线程,所有守护进程线程立即终止。我们可以使用以下方法将非守护线程设置为守护线程:
setDaemon(true)
答案已经有很多了;然而,也许我可以更清楚地解释这一点,因为当我阅读Daemon Threads时,最初,我有一种感觉,我很好地理解了它;然而,在玩了它并调试了一下之后,我发现了一个奇怪的行为。
我被教导:
如果我想让线程在主线程有序完成执行后立即死亡,我应该将其设置为Diamond。
我尝试了什么:
我从主线程中创建了两个线程,我只将其中一个设置为菱形; 在主线程有序完成执行后,那些新创建的线程都没有退出,但我预计,守护线程应该已经退出; 我浏览了许多博客和文章,到目前为止,我找到的最好、最清晰的定义来自《Java并发实践》一书,它非常清楚地指出:
7.4.2守护线程
Sometimes you want to create a thread that performs some helper function but you don’t want the existence of this thread to prevent the JVM from shutting down. This is what daemon threads are for. Threads are divided into two types: normal threads and daemon threads. When the JVM starts up, all the threads it creates (such as garbage collector and other housekeeping threads) are daemon threads, except the main thread. When a new thread is created, it inherits the daemon status of the thread that created it, so by default any threads created by the main thread are also normal threads. Normal threads and daemon threads differ only in what happens when they exit. When a thread exits, the JVM performs an inventory of running threads, and if the only threads that are left are daemon threads, it initiates an orderly shutdown. When the JVM halts, any remaining daemon threads are abandoned— finally blocks are not executed, stacks are not unwound—the JVM just exits. Daemon threads should be used sparingly—few processing activities can be safely abandoned at any time with no cleanup. In particular, it is dangerous to use daemon threads for tasks that might perform any sort of I/O. Daemon threads are best saved for “housekeeping” tasks, such as a background thread that periodically removes expired entries from an in-memory cache.
Java有一种特殊的线程,称为守护线程。
非常低的优先级。 仅在同一程序没有其他线程正在运行时执行。 当守护线程结束时,JVM结束程序,完成这些线程 程序中运行的唯一线程。
守护线程用于什么?
通常用作普通线程的服务提供者。 通常有一个等待服务请求或执行线程任务的无限循环。 他们不能做重要的工作。(因为我们不知道它们什么时候会有CPU时间,如果没有任何其他线程在运行,它们可以在任何时间完成。)
这类线程的一个典型示例是Java垃圾收集器。
有更多的…
在调用start()方法之前,只能调用setDaemon()方法。线程运行后,就不能修改它的守护进程状态。 使用isDaemon()方法检查线程是守护线程还是用户线程。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 自动化invokerrequired代码模式
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder