2012-04-24 32 views
6

Gần đây tôi đã hỏi một câu hỏi:Sự khác nhau giữa một daemon thread và một chủ đề ưu tiên thấp

Chúng tôi đã có những setPriority() phương pháp để thiết lập một thread cho ưu tiên thấp. Sau đó, tại sao chúng ta cần một chuỗi daemon. Sự khác nhau giữa chúng là gì?

Đánh dấu chuỗi là daemon có thay đổi lịch biểu của nó không?

+3

Chúng ta đang nói về ngôn ngữ nào? – Gray

+2

..và hệ điều hành nào ?? –

+0

Hãy nhớ chấp nhận câu trả lời của tôi nếu nó hữu ích. – Gray

Trả lời

14

Chúng tôi đã có phương thức setPriority() để đặt chuỗi có mức độ ưu tiên thấp. Sau đó, tại sao chúng ta cần một chủ đề daemon. Sự khác nhau giữa chúng là gì?

Thông thường, các chuỗi daemon không có liên quan gì đến ưu tiên. Ví dụ, trong Java, JVM sẽ tắt khi tất cả các luồng không phải daemon của người dùng kết thúc. Việc đánh dấu một chuỗi là một chuỗi daemon có nghĩa là nó có thể bị giết một cách an toàn khi JVM thoát.

Ưu tiên sắp xếp lịch - về tần suất một chuỗi nhận được một lát thời gian so với các luồng khác đã sẵn sàng để chạy. Bạn có thể có các chủ đề daemon ưu tiên thấp hoặc các chuỗi daemon ưu tiên cao. Bạn có thể có chủ đề không phải daemon cũng là ưu tiên thấp và cao.

Các khái niệm là trực giao (loại trừ lẫn nhau) - ít nhất là trong mô hình chuỗi Java.

Về mặt thời gian tạo một trình nền chủ đề, tôi sử dụng các chủ đề daemon cho bất kỳ tác vụ nào mà tôi không quan tâm nếu chúng bị gián đoạn khi JVM thoát: chủ đề tiếp tục, bộ xử lý thống kê, xử lý nhật ký, v.v. Mọi nhiệm vụ quan trọng đối với ứng dụng là một chủ đề không phải daemon phải bị gián đoạn cụ thể hoặc được báo hiệu để thoát khỏi bằng cách nào đó.

+0

Cảm ơn Gray. Vì vậy, việc sử dụng tạo ra một chủ đề (trong java) và làm cho nó một chủ đề daemon là gì? Có bất kỳ kịch bản thực tế nào mà chúng tôi sử dụng nó không? – Ash

+1

Tôi sử dụng chủ đề daemon cho bất kỳ thứ gì mà tôi không quan tâm nếu nó bị gián đoạn khi JVM thoát: chủ đề giữ, bộ xử lý thống kê, xử lý nhật ký, v.v. Mọi thứ nhiệm vụ quan trọng đối với ứng dụng là không phải daemon. – Gray

1

Chuỗi chủ đề đang chạy sẽ không ngăn chương trình của bạn kết thúc/thoát. Tuy nhiên, tất cả các chuỗi người dùng phải kết thúc trước khi chương trình của bạn có thể thoát. Ưu tiên có thể áp dụng cho daemon hoặc chuỗi người dùng. Bạn có thể hiểu priority giống như cách bạn hiểu nó trong cuộc sống hàng ngày.

0

Nếu thời gian chạy Java xác định rằng các luồng chỉ chạy trong một ứng dụng là các chuỗi daemon (tức là, không có luồng người dùng nào tồn tại), thời gian chạy Java nhanh chóng đóng ứng dụng, ngăn chặn tất cả các chuỗi daemon bị chết trong các rãnh ghi của chúng. Để ứng dụng tiếp tục chạy, ứng dụng phải luôn có ít nhất một luồng người dùng trực tiếp. Trong tất cả các khía cạnh khác, thời gian chạy Java xử lý các chủ đề daemon và các luồng người dùng theo cách giống hệt nhau.

ngoại trừ trong chuỗi chủ đề .. khi JVM chấm dứt đột ngột thì cuối cùng các khối không được thực thi, ngăn xếp không được bỏ qua - JVM vừa thoát. Do lý do này, các chủ đề daemon nên được sử dụng một cách tiết kiệm và rấ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.

0

Một ví dụ về

  1. JVM tắt khi chủ đề ưu tiên thấp hoàn tất.Mặc dù đề Daemon vẫn chạy
  2. CŨNG, cho thấy rằng chủ đề được tạo ra bởi một daemon thread tự động trở thành một daemon thread

    package junk.daemon_thread_example; 
    
    class DeamonThreadPlus implements Runnable{ 
        String id; 
        boolean createChild; 
    
        public DeamonThreadPlus(String id, boolean createChild){ 
         this.id = id; 
         this.createChild = createChild; 
        } 
    
        @Override 
        public void run() { 
         // Parent daemon thread creates child daemon thread by default 
         if (createChild) 
          new Thread(new DeamonThreadPlus("DaemonChild", false)).start(); 
    
         // This thread never self-completes (only terminates when process dies) 
         while (true){ 
          try { 
           Thread.sleep(1); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
          System.out.println("Daemon " 
            + Thread.currentThread().isDaemon() 
            + " id = " + id); 
          } 
        } 
    } 
    
    class UThread implements Runnable{ 
    
        @Override 
        public void run() { 
         System.out.println("User thread start"); 
         try { 
          Thread.sleep(5); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         System.out.println("User thread end (program exits)"); 
        } 
    } 
    
    public class Caller{ 
    
        public static void main(String[] args) { 
         Thread dt = new Thread(new DeamonThreadPlus("Daemon", true)); 
         dt.setDaemon(true); 
         dt.start(); 
    
         Thread ut = new Thread(new UThread()); 
         ut.setPriority(Thread.MIN_PRIORITY); 
         ut.start(); 
        } 
    
    } 
    

    Đầu ra là: tài khoản chủ đề bắt đầu
    Daemon đúng id = Daemon
    Daemon đúng id = DaemonChild
    Daemon true id = Daemon
    Daemon id đúng = DaemonChild
    Daemon id đúng = Daemon
    Daemon đúng id = DaemonChild
    Daemon đúng id = Daemon
    Daemon đúng id = DaemonChild
    tài khoản chủ đề kết thúc (thoát khỏi chương trình)
    Daemon đúng id = DaemonChild
    Daemon đúng id = Daemon

Các vấn đề liên quan