Một chủ đề daemon trong Java là gì?


809

Ai đó có thể cho tôi biết các chủ đề daemon trong Java không?


20
Các Threadjavadoc mô tả những gì họ đang: java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
Đối với Chủ đề Daemon, khi JVM dừng tất cả các luồng daemon đã thoát do lý do này, các luồng daemon không nên được sử dụng thường xuyên vì việc dọn dẹp có thể không được thực thi trên chúng. Ví dụ, bất kỳ I / O nào sẽ không thoát ra một cách duyên dáng và viết / đọc từ đầu đến cuối.
msj121

Câu trả lời:


631

Một luồng daemon là một luồng không ngăn JVM thoát khi chương trình kết thúc nhưng luồng vẫn chạy. Một ví dụ cho một chủ đề daemon là bộ sưu tập rác.

Bạn có thể sử dụng setDaemon(boolean)phương thức để thay đổi các Threadthuộc tính daemon trước khi luồng bắt đầu.


210
Đối với hậu thế, setDamon(boolean)chỉ có thể được gọi trước khi chủ đề đã được bắt đầu. Theo mặc định, luồng kế thừa trạng thái daemon của luồng gốc.
Xám

1
"không ngăn JVM thoát khi chương trình kết thúc nhưng luồng vẫn đang chạy" trong khi @sateesh nói rằng "JVM tạm dừng mọi luồng daemon còn lại bị bỏ rơi". Vì vậy, các chủ đề daemon kết thúc chạy khi JVM thoát?
Gerald

23
@Gerald, TẤT CẢ các luồng bị giết khi JVM thoát. B_erb nói, "... khi chương trình kết thúc." Điều đó có nghĩa là, nếu chương trình không giết JVM một cách rõ ràng, thì JVM sẽ tự động tự hủy khi luồng không -daemon cuối cùng kết thúc. Chủ đề bình thường xác định "khi chương trình thoát." Chủ đề Daemon không.
Solomon chậm

2
Vì vậy, dòng này thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningvề cơ bản có nghĩa là quá trình JVM bắt đầu luồng không quan tâm nếu luồng daemon kết thúc thực thi hay không, nó sẽ tự kết thúc nếu tất cả các luồng bình thường đã thực hiện xong.
Bhargav

1
@SolomonSlow Hậu quả của việc giết một luồng daemon (ví dụ: trình thu gom rác) trong khi nó vẫn đang thực hiện công việc của mình, khi JVM kết thúc? Cảm ơn.
Venkat Ramakrish Nam

340

Một vài điểm nữa (Tham khảo: Thực hành đồng thời Java )

  • Khi một chủ đề mới được tạo, nó kế thừa trạng thái daemon của cha mẹ của nó.
  • Khi tất cả các luồng không phải daemon kết thúc, JVM tạm dừng và mọi luồng daemon còn lại sẽ bị hủy :

    • cuối cùng các khối không được thực thi ,
    • ngăn xếp không phải là không có cơ sở - JVM vừa thoát.

    Vì lý do này, các chủ đề daemon nên được sử dụng một cách tiết kiệm và thật nguy hiểm khi sử dụng chúng cho các tác vụ có thể thực hiện bất kỳ loại I / O nào.


3
Tại sao chủ đề daemon không nên được sử dụng cho I / O? Có phải là một mối quan tâm về BufferedWriters vv không bị xóa?
Paul Cager

4
@PaulCager Vâng, họ chỉ có thể bị cắt ở đầu gối ở giữa viết / đọc.
Cruncher

52
Điểm thứ hai là vô nghĩa. Khi JVM tạm dừng, tất cả các luồng đều chết và không có finallykhối nào được thực thi, bất kể các luồng có phải là daemon hay không. Vì vậy, đừng gọi System.exit(…)nếu bạn nghĩ rằng có thể có các luồng đang chạy I / O. Sự khác biệt duy nhất là JVM sẽ kích hoạt sự chấm dứt của chính nó khi chỉ còn lại các luồng daemon.
Holger

11
"Ngăn xếp không phải là không có nghĩa" là gì?
ɢʜʘʂʈ 21/05/2015

2
@ có một số giải thích về "ngăn xếp thư giãn", bao gồm cả giải thích này: flylib.com/books/en/2.254.1.277/1
user766353 18/8/2015

175

Tất cả các câu trả lời trên là tốt. Đây là một đoạn mã nhỏ đơn giản, để minh họa cho sự khác biệt. Hãy thử nó với từng giá trị đúng và sai trong setDaemon.

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 user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main 
        // thread 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
            }
        }
    }
}

2
@russ Đoạn mã tốt! Tôi đã phải định nghĩa lớp WorkerThread là tĩnh.
xli

@xli bạn có thể đã thực hiện DaemonTest mới (). WorkerThread mới (). start () nữa :)
abhy

@russ ví dụ hay. Tôi biết rằng cái mặc định là "setDeamon (false)" nếu bạn không xác định rõ ràng "setDaemon (true)"
huseyin

96

Các quy trình daemon truyền thống trong UNIX là các quy trình liên tục chạy trong nền, giống như các dịch vụ trong Windows.

Một luồng daemon trong Java là một luồng không ngăn JVM thoát. Cụ thể, JVM sẽ thoát khi chỉ còn các luồng daemon. Bạn tạo một cái bằng cách gọi setDaemon()phương thức trên Thread.

Có một chủ đề của Daemon .


3
liên kết của bạn đã chết tại thời điểm này, có lẽ bạn muốn cập nhật? Dù sao, +1 cho bạn.
Jasonw

2
Tôi thích sự so sánh giữa UNIX và Windows.
Premraj 24/07/2015

Giải thích tốt nhất ở đây!
LoveMeow

57

Các luồng Daemon giống như một nhà cung cấp dịch vụ cho các luồng hoặc đối tượng khác đang chạy trong cùng tiến trình với luồng daemon. Các luồng Daemon được sử dụng cho các tác vụ hỗ trợ nền và chỉ cần thiết trong khi các luồng thông thường đang thực thi. Nếu các luồng thông thường không chạy và các luồng còn lại là các luồng daemon thì trình thông dịch sẽ thoát.

Ví dụ: trình duyệt HotJava sử dụng tối đa bốn luồng daemon có tên "Trình tải hình ảnh" để tìm nạp hình ảnh từ hệ thống tệp hoặc mạng cho bất kỳ luồng nào cần một luồng.

Các luồng Daemon thường được sử dụng để thực hiện các dịch vụ cho ứng dụng / applet của bạn (chẳng hạn như tải "bit fiddley"). Sự khác biệt cốt lõi giữa các luồng người dùng và luồng daemon là JVM sẽ chỉ tắt một chương trình khi tất cả các luồng người dùng đã kết thúc. Các luồng Daemon bị JVM chấm dứt khi không còn bất kỳ luồng người dùng nào đang chạy, bao gồm cả luồng thực thi chính.

setDaemon (đúng / sai)? Phương pháp này được sử dụng để xác định rằng một luồng là luồng daemon.

boolean isDaemon ()? Phương pháp này được sử dụng để xác định luồng có phải là luồng daemon hay không.

Ví dụ:

public class DaemonThread extends Thread {
    public void run() {
        System.out.println("Entering run method");

        try {
            System.out.println("In run Method: currentThread() is" + Thread.currentThread());

            while (true) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException x) {}

                System.out.println("In run method: woke up again");
            }
        } finally {
            System.out.println("Leaving run Method");
        }
    }
    public static void main(String[] args) {
        System.out.println("Entering main Method");

        DaemonThread t = new DaemonThread();
        t.setDaemon(true);
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException x) {}

        System.out.println("Leaving main method");
    }

}

Ra ngoài:

C:\java\thread>javac DaemonThread.java

C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method

C:\j2se6\thread>

37

Định nghĩa của Daemon (Máy tính):

Một quy trình nền xử lý các yêu cầu cho các dịch vụ như in đệm và truyền tệp và không hoạt động khi không cần thiết.

Nguồn của Dick Nguồn: Tiếng Anh của Từ điển Oxford

Chủ đề Daemon trong Java là gì?

  • Các luồng Daemon có thể tắt bất cứ lúc nào ở giữa luồng của chúng, Non-Daemon tức là luồng người dùng thực thi hoàn toàn.
  • Chủ đề Daemon là các luồng chạy xen kẽ trong nền miễn là các luồng không phải daemon khác đang chạy.
  • Khi tất cả các luồng không phải daemon hoàn thành, các luồng daemon sẽ tự động chấm dứt.
  • Chủ đề Daemon là nhà cung cấp dịch vụ cho chủ đề người dùng đang chạy trong cùng một quy trình.
  • JVM không quan tâm đến các luồng daemon sẽ hoàn thành khi ở trạng thái Chạy, thậm chí cuối cùng khối cũng không cho phép thực thi. JVM ưu tiên cho các luồng không phải daemon được tạo bởi chúng tôi.
  • Chủ đề Daemon hoạt động như các dịch vụ trong Windows.
  • JVM dừng các luồng daemon khi tất cả các luồng người dùng (trái ngược với các luồng daemon) bị chấm dứt. Do đó, các luồng daemon có thể được sử dụng để thực hiện, ví dụ, chức năng giám sát khi luồng bị dừng bởi JVM ngay khi tất cả các luồng của người dùng đã dừng.

nếu bạn gọi System.exit (), cuối cùng không có khối nào được thực thi, bất kể luồng là luồng daemon. thực sự cuối cùng các khối được thực thi trong các luồng daemon ngay cả sau khi luồng người dùng cuối cùng chấm dứt nếu JVM chưa giết được luồng này
benez

5
Một luồng daemon thực thi ở cùng mức độ ưu tiên như luồng tạo của nó, trừ khi nó đã được thay đổi trước khi bắt đầu. Các luồng của Daemon không nhất thiết là 'nhà cung cấp dịch vụ' hoặc các dịch vụ Windows hoặc bất kỳ thứ gì khác được nêu ở đây: chúng chỉ là các luồng không ngăn JVM thoát ra. Giai đoạn = Stage.
Hầu tước Lorne

35

Một chủ đề daemon là một chủ đề được coi là thực hiện một số tác vụ trong nền như xử lý các yêu cầu hoặc các chronjob khác nhau có thể tồn tại trong một ứng dụng.

Khi chương trình của bạn chỉ còn các chủ đề daemon, nó sẽ thoát. Đó là bởi vì thông thường các luồng này hoạt động cùng với các luồng bình thường và cung cấp xử lý nền cho các sự kiện.

Bạn có thể chỉ định rằng a Threadlà một daemon bằng cách sử dụng setDaemonphương thức, chúng thường không thoát, chúng không bị gián đoạn .. chúng chỉ dừng khi ứng dụng dừng.


1
Đó là bởi vì đó là một chủ đề daemon, và đó là ý nghĩa của 'daemon'. Lý luận của bạn đã trở lại phía trước.
Hầu tước Lorne

15

Một quan niệm sai lầm tôi muốn làm rõ:

  • Giả sử rằng nếu luồng daemon (nói B) được tạo trong luồng người dùng (giả sử A); sau đó kết thúc chủ đề người dùng / chủ đề gốc (A) sẽ không kết thúc chủ đề daemon / chủ đề con (B) mà nó đã tạo; cung cấp chủ đề người dùng là người duy nhất hiện đang chạy.
  • Vì vậy, không có mối quan hệ cha-con trên kết thúc chủ đề. Tất cả các luồng daemon (không phân biệt nơi nó được tạo) sẽ kết thúc một khi không có luồng người dùng trực tiếp nào và điều đó khiến JVM chấm dứt.
  • Thậm chí điều này đúng cho cả hai (cha mẹ / con) là các chủ đề daemon.
  • Nếu một luồng con được tạo từ một luồng daemon thì đó cũng là một luồng daemon. Điều này sẽ không cần bất kỳ thiết lập cờ chủ đề daemon rõ ràng. Tương tự nếu một luồng con được tạo từ một luồng người dùng thì đó cũng là một luồng người dùng, nếu bạn muốn thay đổi nó, thì cần cài đặt cờ daemon rõ ràng trước khi bắt đầu luồng con đó.

Điều này không được trích dẫn từ bất cứ điều gì. Không sử dụng định dạng trích dẫn cho văn bản không được trích dẫn. Đoạn đầu tiên của 'trích dẫn' là không chính xác, và mâu thuẫn với đoạn thứ hai.
Hầu tước Lorne

@EJP GOT IT, vì vậy mỗi người phải đưa ra báo giá cho người khác ở đây, không phải của riêng họ. HOẶC chính chúng ta đã trích dẫn ở đâu đó sau đó chỉ ở đây?
Kanagavelu Sugumar

Có, nếu bạn trích dẫn ai đó bạn phải trích dẫn họ, giống như bất kỳ nơi nào khác, nếu bạn không trích dẫn bất kỳ ai không định dạng nó như thể bạn có. Tôi không thể làm cho đầu hoặc đuôi câu thứ hai của bạn.
Hầu tước Lorne

12

Chủ đề Daemon và chủ đề người dùng. Nói chung tất cả các luồng được tạo bởi lập trình viên là luồng người dùng (trừ khi bạn chỉ định nó là daemon hoặc luồng gốc của bạn là luồng daemon). Chủ đề người dùng thường có nghĩa là để chạy mã chương trình của chúng tôi. JVM không chấm dứt trừ khi tất cả các luồng người dùng chấm dứt.


10

Java có một loại luồng đặc biệt gọi là luồng daemon .

  • Ưu tiên rất thấp.
  • Chỉ thực thi khi không có luồng nào khác của cùng một chương trình đang chạy.
  • JVM kết thúc chương trình hoàn thiện các luồng này, khi các luồng daemon là các luồng duy nhất đang chạy trong một chương trình.

Chủ đề daemon được sử dụng để làm gì?

Thường được sử dụng như nhà cung cấp dịch vụ cho chủ đề bình thường. Thường có một vòng lặp vô hạn chờ yêu cầu dịch vụ hoặc thực hiện các nhiệm vụ của luồng. Họ không thể làm những công việc quan trọng. (Bởi vì chúng tôi không biết khi nào họ sẽ có thời gian CPU và họ có thể hoàn thành bất cứ lúc nào nếu không có bất kỳ luồng nào khác đang chạy.)

Một ví dụ điển hình của các loại luồng này là trình thu gom rác Java .

Còn nữa...

  • Bạn chỉ gọi setDaemon()phương thức trước khi bạn gọi start()phương thức. Khi luồng đang chạy, bạn không thể sửa đổi trạng thái trình nền của nó.
  • Sử dụng isDaemon()phương pháp để kiểm tra xem một luồng là một luồng daemon hay một luồng người dùng.

8
-1, tôi không tin rằng một chủ đề daemon vốn có mức độ ưu tiên thấp. Chắc chắn không có tài liệu nào tôi thấy các tiểu bang như vậy. Ngoài ra câu trả lời SO này tuyên bố rằng mức độ ưu tiên và tính năng daemon là trực giao: stackoverflow.com/a/10298353/839128
MikeFHay

5
Chủ đề Daemon không có gì để làm với ưu tiên. Bạn có thể có một chủ đề daemon ưu tiên cao hoặc một chủ đề không daemon ưu tiên thấp.
Xám

Một chủ đề daemon ban đầu có cùng mức độ ưu tiên như chủ đề tạo của nó.
Hầu tước Lorne

Câu lệnh "'Chỉ thực thi khi không có luồng nào khác của cùng một chương trình đang chạy" là sai lệch.
Fredrick Gauss

9

Chủ đề Daemon giống như trợ lý. Chủ đề không phải Daemon giống như người biểu diễn phía trước. Trợ lý giúp người biểu diễn hoàn thành công việc. Khi công việc hoàn thành, người biểu diễn không cần sự giúp đỡ để thực hiện nữa. Vì không cần giúp đỡ nên các trợ lý rời khỏi nơi này. Vì vậy, khi công việc của các chủ đề Non-Daemon kết thúc, các chủ đề Daemon sẽ diễu hành.


5

Chủ đề Daemon giống như một luồng thông thường ngoại trừ việc JVM sẽ chỉ tắt khi các luồng không phải daemon khác không tồn tại. Chủ đề Daemon thường được sử dụng để thực hiện các dịch vụ cho ứng dụng của bạn.


5

Chủ đề Daemon trong Java là các luồng chạy trong nền và chủ yếu được tạo bởi JVM để thực hiện các tác vụ nền như bộ sưu tập Rác và các tác vụ giữ nhà khác.

Điểm cần lưu ý :

  1. Bất kỳ luồng nào được tạo bởi luồng chính, chạy phương thức chính trong Java theo mặc định là không phải daemon vì Thread thừa hưởng bản chất daemon của nó từ luồng tạo ra nó tức là luồng gốc và vì luồng chính là luồng không daemon, nên bất kỳ luồng nào khác được tạo từ nó sẽ vẫn không phải daemon cho đến khi daemon được tạo rõ ràng bằng cách gọi setDaemon (true).

  2. Thread.setDaemon (true) tạo một daemon Thread nhưng nó chỉ có thể được gọi trước khi bắt đầu Thread trong Java. Nó sẽ ném IllegalThreadStateException nếu Thread tương ứng đã được bắt đầu và chạy.

Sự khác biệt giữa luồng Daemon và Non Daemon trong Java:

1) JVM không đợi bất kỳ luồng daemon nào kết thúc trước khi tồn tại.

2) Chủ đề Daemon được xử lý khác với Chủ đề người dùng khi JVM chấm dứt, cuối cùng các khối không được gọi, Ngăn xếp không được giải quyết và JVM chỉ tồn tại.


5

Trong Java, Chủ đề Daemon là một trong những loại luồng không ngăn Máy ảo Java (JVM) thoát. Mục đích chính của luồng daemon là thực thi tác vụ nền, đặc biệt trong trường hợp một số tác vụ hoặc công việc định kỳ thông thường. Với lối ra JVM, luồng daemon cũng chết.

Bằng cách đặt a thread.setDaemon(true), một chủ đề trở thành một chủ đề daemon. Tuy nhiên, bạn chỉ có thể đặt giá trị này trước khi bắt đầu chuỗi.


Các loại khác của chủ đề làm điều đó là gì? A: Không có. Có chủ đề daemon và chủ đề không daemon, thời gian. Nó là một nhị phân, Hai trạng thái.
Hầu tước Lorne

5

Dưới đây là một ví dụ để kiểm tra hành vi của các luồng daemon trong trường hợp thoát jvm do không tồn tại các luồng của người dùng.

Xin lưu ý dòng cuối cùng thứ hai trong đầu ra dưới đây, khi chủ đề chính đã thoát, daemon thread cũng chết và không in cuối cùng executed9 tuyên bố trong khối finally. Điều này có nghĩa là bất kỳ tài nguyên i / o nào được đóng trong khối cuối cùng của luồng daemon sẽ không bị đóng nếu JVM thoát do không tồn tại các luồng của người dùng.

public class DeamonTreadExample {

public static void main(String[] args) throws InterruptedException {

    Thread t = new Thread(() -> {
        int count = 0;
        while (true) {
            count++;
            try {
                System.out.println("inside try"+ count);
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                System.out.println("finally executed"+ count);
            }
        }
    });
    t.setDaemon(true);
    t.start();

    Thread.currentThread().sleep(10000);
    System.out.println("main thread exited");
  }
}

Đầu ra

inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited

4

Các luồng Daemon như mọi người đã giải thích, sẽ không hạn chế JVM để thoát, vì vậy về cơ bản, đây là một luồng hạnh phúc cho Ứng dụng theo quan điểm thoát.

Muốn thêm các luồng daemon có thể được sử dụng khi nói rằng tôi đang cung cấp API như đẩy dữ liệu lên máy chủ của bên thứ 3 / hoặc JMS, tôi có thể cần tổng hợp dữ liệu ở cấp JVM của máy khách và sau đó gửi đến JMS trong một luồng riêng biệt. Tôi có thể tạo chủ đề này dưới dạng chủ đề daemon, nếu đây không phải là dữ liệu bắt buộc được đẩy lên máy chủ. Loại dữ liệu này giống như đẩy / tổng hợp nhật ký.

Trân trọng, Manish


Đây là một chương trình đơn giản hiển thị chủ đề daemon trong java. journaldev.com/1072/java-daemon-thread-example
Pankaj

4

Chuỗi daemon giống như tiến trình daemon chịu trách nhiệm quản lý tài nguyên, luồng daemon được Java VM tạo ra để phục vụ các luồng người dùng. ví dụ hệ thống cập nhật cho unix, unix là quá trình daemon. con của luồng daemon luôn là luồng daemon, do đó, mặc định daemon là false. Bạn có thể kiểm tra luồng như daemon hoặc người dùng bằng cách sử dụng phương thức "isDaemon ()". vì vậy chủ đề daemon hoặc quá trình daemon chịu trách nhiệm cơ bản để quản lý tài nguyên. ví dụ: khi bạn bắt đầu jvm, có trình thu gom rác đang chạy là luồng daemon có mức ưu tiên là 1 thấp nhất, đó là quản lý bộ nhớ. jvm vẫn tồn tại miễn là luồng người dùng còn sống, bạn không thể giết daemon thread.jvm chịu trách nhiệm giết các luồng daemon.


Rất bối rối, và tất cả 'vì vậy không phải là trình tự.
Hầu tước Lorne

3

Chúng ta chỉ nói chuyện bằng mã với các ví dụ làm việc. Tôi thích câu trả lời của Nga ở trên nhưng để xóa bỏ mọi nghi ngờ tôi có, tôi đã tăng cường thêm một chút. Tôi đã chạy nó hai lần, một lần với luồng công nhân được đặt thành deamon true (luồng deamon) và lần khác đặt nó thành false (luồng người dùng). Nó xác nhận rằng luồng deamon kết thúc khi luồng chính kết thúc.

public class DeamonThreadTest {

public static void main(String[] args) {

    new WorkerThread(false).start();    //set it to true and false and run twice.

    try {
        Thread.sleep(7500);
    } catch (InterruptedException e) {
        // handle here exception
    }

    System.out.println("Main Thread ending");
    }
   }

   class WorkerThread extends Thread {

    boolean isDeamon;

    public WorkerThread(boolean isDeamon) {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main
        // thread terminates.
        this.isDeamon = isDeamon;
        setDaemon(isDeamon);
    }

    public void run() {
        System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));

        int counter = 0;

        while (counter < 10) {
            counter++;
            System.out.println("\tworking from Worker thread " + counter++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
        System.out.println("\tWorker thread ends. ");
    }
}



result when setDeamon(true)
=====================================
I am a Deamon Thread
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending

Process finished with exit code 0


result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending
    working from Worker thread 2
    working from Worker thread 3
    working from Worker thread 4
    working from Worker thread 5
    working from Worker thread 6
    working from Worker thread 7
    working from Worker thread 8
    working from Worker thread 9
    Worker thread ends. 

Process finished with exit code 0

3

Chủ đề Daemon thường được gọi là chủ đề "Nhà cung cấp dịch vụ". Các luồng này không nên được sử dụng để thực thi mã chương trình mà là mã hệ thống. Các luồng này chạy song song với mã của bạn nhưng JVM có thể giết chúng bất cứ lúc nào. Khi JVM không tìm thấy các luồng người dùng, nó dừng nó và tất cả các luồng daemon chấm dứt ngay lập tức. Chúng ta có thể đặt luồng không phải daemon thành daemon bằng cách sử dụng:

setDaemon(true)

3
Chúng không phải là "thường được gọi là chủ đề" Nhà cung cấp dịch vụ ".
Hầu tước Lorne

1
Và chúng có thể được sử dụng để thực thi bất kỳ mã nào. JVM không thể 'giết chúng bất cứ lúc nào', nhưng nó sẽ giết chúng khi không có các luồng không phải daemon nào đang chạy.
Hầu tước Lorne

@EJP có thể tôi sai nhưng "nó sẽ giết chúng" khi các luồng không phải daemon chạy. Khi một luồng là daemon, nó không chạy riêng giữ jvm cho đến khi nó thực thi hoàn toàn và hiện được quản lý ở cấp HĐH.
89n3ur0n

Nó sẽ giết chúng khi tất cả các luồng không phải daemon đã thoát, và không phải là một picosecond trước đó. Chắc chắn không phải "bất cứ lúc nào".
Hầu tước Lorne

3

Chủ đề Daemon là các chủ đề chạy trong nền miễn là các chủ đề không phải trình nền khác của quy trình vẫn đang chạy. Do đó, khi tất cả các luồng không phải daemon hoàn thành, các luồng daemon bị chấm dứt. Một ví dụ cho luồng không phải daemon là luồng chạy Main. Một luồng được tạo daemon bằng cách gọi setDaemon()phương thức trước khi luồng được bắt đầu

Để tham khảo thêm: Chủ đề Daemon trong Java


2

Đối với tôi, chủ đề daemon giống như người quản lý nhà cho chủ đề người dùng. Nếu tất cả các luồng người dùng kết thúc, luồng daemon không có công việc và bị JVM giết. Tôi đã giải thích nó trong video YouTube .


2

JVM sẽ hoàn thành công việc khi việc thực thi luồng không phải daemon cuối cùng được hoàn thành. Theo mặc định, JVM sẽ tạo một luồng như nondaemon nhưng chúng ta có thể tạo Thread như một daemon với sự trợ giúp của phương thức setDaemon(true). Một ví dụ điển hình của luồng Daemon là luồng GC sẽ hoàn thành công việc của anh ta ngay khi tất cả các luồng nondaemon được hoàn thành.


làm thế nào có thể là làm thế nào các chủ đề GC hoạt động? Bộ sưu tập rác không chạy ngay cả khi luồng chính của chương trình mất một thời gian rất dài (luồng chính không kết thúc)?
Calicoder

Như tôi đã đề cập, luồng GC sẽ hoạt động cho đến khi kết thúc chuỗi NON daemon cuối cùng sẽ hoàn thành việc thực thi. Chủ đề chính của chương trình không phải là daemon như chúng ta biết do đó, chủ đề GC sẽ hoàn thành công việc một khi chủ đề chính được hoàn thành / bị giết. Về cơ bản tôi muốn nói rằng (các) luồng daemon sẽ chấm dứt khi quá trình hoàn thành và quá trình được hoàn thành khi tất cả các luồng không daemon được thực thi.
Arman Tumanyan

Theo mặc định, trạng thái daemon của một luồng được kế thừa từ cha của nó.
Hầu tước Lorne

-1

Chủ đề Daemon chết khi chủ đề của người tạo thoát ra.

Các chủ đề không phải daemon (mặc định) thậm chí có thể sống lâu hơn các chủ đề chính.

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();

Cái này sai. Nó không phải là về chủ đề của người sáng tạo. Nếu có BẤT K thread luồng nào không chạy, các luồng daemon sẽ tiếp tục chạy. Điều này có thể dễ dàng được kiểm tra bằng cách tạo ra một luồng tiền cảnh sinh ra một luồng daemon. Ngay cả sau khi chủ đề nền trước là joined, daemon sẽ vẫn duy trì miễn là chủ đề chính chạy.
Hubert Grzeskowiak

Các chủ đề của Daemon sẽ chết khi JVM không còn là các chủ đề không phải daemon có thể chạy được nữa. Xem Javadoc. Trả lời là hoàn toàn không chính xác.
Hầu tước Lorne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.