線程分類
守護線程(即daemon thread),是個服務線程,準確地來說就是服務其他的線程,這是它的作用——而其他的線程只有一種,那就是用戶線程。所以java裏線程分2種:
- 用戶線程:比如垃圾回收線程,就是最典型的守護線程
- 守護線程:就是應用程序裏的自定義線程
用戶線程舉例
public class UserTest {
public static void main(String[] args) {
Thread daemonThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("hi daemon....");
}
}
}
);
daemonThread.start();
try {
Thread.sleep(1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread is over!");
}
}
守護線程舉例
public class DaemonTest {
public static void main(String[] args) {
Thread daemonThread = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
System.out.println("hi Daemon....");
}
}
}
);
daemonThread.setDaemon(true);
daemonThread.start();
try {
Thread.sleep(1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread is over!");
}
}
結果對比
用戶線程中會一直執行下去,守護線程執行一會就結束了。
定義
-
守護線程,專門用於服務其他的線程,如果其他的線程(即用戶自定義線程)都執行完畢,連main線程也執行完畢,那麼jvm就會退出(即停止運行)——此時,連jvm都停止運行了,守護線程當然也就停止執行了。
- 再換一種說法,如果有用戶自定義線程存在的話,jvm就不會退出——此時,守護線程也不能退出,也就是它還要運行,幹嘛呢,就是爲了執行垃圾回收的任務啊。
守護進程和用戶進程同時執行任務的例子
public class MyCommon extends Thread {
public void run() {
for (int i = 0; i < 5; ++i) {
System.out.println("線程1第 " + i + " 次執行");
try {
Thread.sleep(7);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class MyDaemon extends Thread {
public void run() {
for (int i = 0; i < 5000; ++i) {
System.out.println("後臺線程1第 " + i + " 次執行");
try {
Thread.sleep(7);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread thread1 = new MyCommon();
Thread thread2 = new MyDaemon();
thread2.setDaemon(true);
thread1.start();
thread2.start();
}
}
執行結果
後臺線程1第 0 次執行
線程1第 0 次執行
後臺線程1第 1 次執行
線程1第 1 次執行
後臺線程1第 2 次執行
線程1第 2 次執行
後臺線程1第 3 次執行
線程1第 3 次執行
後臺線程1第 4 次執行
線程1第 4 次執行
後臺線程1第 5 次執行