1. 程式人生 > >Java的守護執行緒與非守護執行緒

Java的守護執行緒與非守護執行緒

守護執行緒與非守護執行緒

最近在看多執行緒的Timer章節,發現運用到了守護執行緒,感覺Java的基礎知識還是需要補充。

Java分為兩種執行緒:使用者執行緒和守護執行緒

所謂守護執行緒是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執行緒並不屬於程式中不可或缺的部分。因 此,當所有的非守護執行緒結束時,程式也就終止了,同時會殺死程序中的所有守護執行緒。反過來說,只要任何非守護執行緒還在執行,程式就不會終止。

守護執行緒和使用者執行緒的沒啥本質的區別:唯一的不同之處就在於虛擬機器的離開:如果使用者執行緒已經全部退出執行了,只剩下守護執行緒存在了,虛擬機器也就退出了。 因為沒有了被守護者,守護執行緒也就沒有工作可做了,也就沒有繼續執行程式的必要了。

將執行緒轉換為守護執行緒可以通過呼叫Thread物件的setDaemon(true)方法來實現。在使用守護執行緒時需要注意一下幾點:

(1) thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在執行的常規執行緒設定為守護執行緒。

(2) 在Daemon執行緒中產生的新執行緒也是Daemon的。

(3) 守護執行緒應該永遠不去訪問固有資源,如檔案、資料庫,因為它會在任何時候甚至在一個操作的中間發生中斷。

Timer程式碼示例:

import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask
{
  @Override
  public void run() {
    System.out.println("任務執行了,時間為:"+new Date());
}

主函式

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Test1 {
public static void main(String[] args){
    System.out.println("當前時間:"+new Date());
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.SECOND,10);
    Date date=calendar.getTime();
    MyTask task=new MyTask();
    Timer timer=new Timer();
    timer.schedule(task,date);
   }
}

執行結果:

    當前時間:Sat Jun 03 11:47:40 CST 2017
    任務執行了,時間為:Sat Jun 03 11:47:50 CST 2017

任務雖然執行完了,但程序還未銷燬,呈紅色狀態,為什麼會出現這種情況呢?

可以看一下Timer的原始碼

public Timer() {
    this("Timer-" + serialNumber());
}
public Timer(String name) {
    thread.setName(name);
    thread.start();
}

可以看出每建立一個Timer就是啟動一個新的執行緒,那麼啟動的執行緒不是守護執行緒,所以一直執行。將新建立的的Timer改成守護執行緒,更改如上的程式碼:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test1 {
public static void main(String[] args){
    System.out.println("當前時間:"+new Date());
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.SECOND,10);
    Date date=calendar.getTime();
    MyTask task=new MyTask();
    Timer timer=new Timer(true);
    timer.schedule(task,date);
 }
}

執行結果如下:

當前時間:Sat Jun 03 11:47:40 CST 2017

守護執行緒中產生的執行緒也是守護執行緒

如下示例:

public class Daemon implements Runnable {
private Thread[] t = new Thread[10];

@Override
public void run() {
    for (int i=0; i<t.length; i++) {

        t[i] = new Thread(new DaemonSpawn());

        t[i].start();

        System.out.println("DaemonSpawn " + i + " started.");

    }

    for (int i=0; i<t.length; i++) {

        System.out.println("t[" + i + "].isDaemon() = " +

                t[i].isDaemon() + ".");

    }

    while (true) {

        Thread.yield();

    }


}
}

類DaemonSpawn:

public class DaemonSpawn implements Runnable {
@Override
public void run() {
    while (true) {

        Thread.yield();

    }


}
}

主函式:

import java.util.concurrent.TimeUnit;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
    Thread d = new Thread(new Daemon());

    d.setDaemon(true); //必須在啟動執行緒前呼叫

    d.start();

    System.out.println("d.isDaemon() = " + d.isDaemon() + ".");

    TimeUnit.SECONDS.sleep(1);
}
}

執行結果如圖:

d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.
t[0].isDaemon() = true.
t[1].isDaemon() = true.
t[2].isDaemon() = true.
t[3].isDaemon() = true.
t[4].isDaemon() = true.
t[5].isDaemon() = true.
t[6].isDaemon() = true.
t[7].isDaemon() = true.
t[8].isDaemon() = true.
t[9].isDaemon() = true.

Process finished with exit code 0

如果將mian函式中的TimeUnit.SECONDS.sleep(1);註釋掉,看一下TimeUnit.SECONDS.sleep()的原始碼:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}

其實就是對Thread.sleep()的封裝,提供了可讀性更好的執行緒暫停操作
註釋後代碼執行如下:

d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.

以上結果也說明了如果使用者執行緒全部退出了,只剩下守護執行緒存在了,虛擬機器也就退出了。

相關推薦

(轉)Java中的守護執行 Java守護執行守護執行

Java的守護執行緒與非守護執行緒   守護執行緒與非守護執行緒 最近在看多執行緒的Timer章節,發現運用到了守護執行緒,感覺Java的基礎知識還是需要補充。 Java分為兩種執行緒:使用者執行緒和守護執行緒 所謂守護執行緒是指在程式執行的時候在後臺提供一

Java守護執行守護執行

守護執行緒與非守護執行緒 最近在看多執行緒的Timer章節,發現運用到了守護執行緒,感覺Java的基礎知識還是需要補充。 Java分為兩種執行緒:使用者執行緒和守護執行緒 所謂守護執行緒是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執行緒並不屬於程式中不

Java 守護執行守護執行的區別

ublic   static   void   main   是在一個非守護執行緒中執行的,但是JVM中並不一定只有這個非守護執行緒,你可以在程式中啟動多個非守護執行緒,JVM同樣也會等待它們的退出。所以並非主執行緒(執行main方法的執行緒)退出就一定退出JVM。 守護

java守護執行守護執行(使用者執行

Java的執行緒機制,在Java中有兩類執行緒:User Thread(使用者執行緒)、Daemon Thread(守護執行緒) 估計學過Unix開發但是沒有細緻學習Java的同學們會疑惑了,作業系統裡面是沒有所謂的守護執行緒的概念,只有守護程序一說,但是Java語言機

守護執行守護執行

Java分為兩種執行緒:使用者執行緒和守護執行緒所謂守護執行緒是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執行緒並不屬於程式中不可或缺的部分。因 此,當所有的非守護執行緒結束時,程式也就終止了,同時會殺死程序中的所有守

java守護線程守護線程

細致 相關信息 控制 理解 start read 取出 作者 一點 最近重新研究Java基礎知識,發現以前太多知識知識略略帶過了,比較說Java的線程機制,在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程) ,(PS:以前忽略

阻塞執行阻塞執行

阻塞執行緒:A,B執行緒有一個公共的資源,比如說變數params,當A訪問params時,給params加鎖,而這時B要訪問params時,它只有等待A釋放params鎖時,才可以訪問; 非阻塞執行緒:A,B執行緒有一個公共的資源,比如說變數params,當A訪問param

關於UI執行UI執行互動,有關Handler機制等(一)

在Android中,一個activity有一個主執行緒也叫UI執行緒,作用就是用來繪製UI介面,在這個執行緒裡面,你的應用和android的UI元件發生互動。所以當你需要進行某些費時操作的時候,比如訪問網路等,如果放入UI執行緒,就會阻塞介面的繪製,當介面不能繪製的時候,整

守護線程守護線程的區別

感覺 stat test 本質 殺死 知識 所有 調用 存在 守護線程與非守護線程 最近在看多線程的Timer章節,發現運用到了守護線程,感覺Java的基礎知識還是需要補充。 Java分為兩種線程:用戶線程和守護線程 所謂守護線程是指在程序運行的時候在後臺提供一種通用服務的

Java守護執行守護執行

一、守護執行緒         java分為兩種執行緒:使用者執行緒和守護執行緒         守護執行緒是指在程式執行的時候在後臺提供一種通用服務的執行緒,比如垃圾回收執行緒就是一個很稱職的守護者,並且這種執

java守護執行守護執行

Java 執行緒分為兩類:使用者執行緒(User Thread)和守護執行緒(Daemon Thread) 守護執行緒的作用是為其他執行緒提供服務,譬如垃圾回收器(GC),只要當前 JVM 例項中還有非守護執行緒執行,則守護執行緒就會一直工作下去,直至所有非守護執行緒結束,

Java執行守護執行守護執行

本文內容大多基於官方文件和網上前輩經驗總結,經過個人實踐加以整理積累,僅供參考。 Java 執行緒分為兩類:使用者執行緒(User Thread)和守護執行緒(Daemon Thread) 守護執行緒的作用是為其他執行緒提供服務,譬如垃圾回收器(GC),

java執行_守護執行守護執行

基本概念 守護執行緒:和主執行緒一起結束的執行緒,叫守護執行緒。 非守護執行緒:主執行緒的結束不影響執行緒的執行的執行緒,也叫使用者執行緒。 如何將一個執行緒t變成守護執行緒 呼叫t.setDaemon(true)方法將非守護執行緒變為守護執行緒。

執行守護執行守護執行

主執行緒 main,但不是守護執行緒。 守護執行緒 是指在程式執行的時候在後臺提供一種通用服務的執行緒。如gc。 非守護執行緒 也叫使用者執行緒,由使用者建立。 關係: 主執行緒和守護執行緒一起銷燬; 主執行緒和非守護執行緒互不影響。 例如: package

守護執行守護執行簡介和addShutdownHook方法使用

  1,首先什麼是守護執行緒,什麼是非守護執行緒呢 下面是網上資料總結如下: Java有兩種Thread:“守護執行緒Daemon”(守護執行緒)與“使用者執行緒User”(非守護執行緒)。 從字面上我們很容易將守護執行緒理解成是由虛擬機器(virtual machine)

Java執行android多執行

https://www.cnblogs.com/zoe-mine/p/7954605.html      java多執行緒以及Android多執行緒執行緒和程序的區別執行緒和程序的本質:由CPU進行排程的併發式執行任務,多個任務被快速輪換執行,使得巨集觀上具有多個執行緒或者程

Java 靜態(static)靜態執行順序

Java中的靜態(static)關鍵字只能用於成員變數或語句塊,不能用於區域性變數 static 語句的執行時機實在第一次載入類資訊的時候(如呼叫類的靜態方法,訪問靜態成員,或者呼叫建構函式), static 語句和 static 成員變數的初始化會先於其他語句執行,而且只會在載入類資訊的時候執行一次,以後

使用者級執行核心級執行

1、使用者級執行緒 把整個執行緒實現部分放在使用者空間中,核心對執行緒一無所知,核心看到的就是一個單執行緒程序。 只有一個使用者棧 優點: 1)整個使用者級執行緒的切換髮生在使用者空間,這樣的執行緒切換至少比陷入核心要快一個數量級

執行第一個執行程式

1.執行緒的相關概念 首先得知道什麼是程序什麼是執行緒? 我的理解是程序是指在系統中正在執行的一個應用程式;程式一旦執行就是程序,或者更專業化來說:程序是指程式執行時的一個例項。 執行緒是程序的一個實體。 程序——資源分配的最小單位,執行緒——程式執行的最小單位。

0 Linux下Java使用ProcessBuilder執行命令直接Bash執行命令之間的不同(環境變數方面)

0 問題發生 xiaojietest.java package tasks; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter;