2013-05-10 23 views
6

Tôi đang cố gắng tìm ra những lợi thế có thể của việc mở rộng lớp Thread là gì?Lợi thế chính của việc mở rộng lớp Thread (hoặc khi mở rộng Thread thay vì thực hiện runnable)

Đây là một phần của một câu hỏi khác mà tôi mô tả: Có hai cách tạo ra chủ đề trong Java

  1. kéo dài từ Chủ đề lớp
  2. thực hiện giao diện Runnable

Như expalined here có một số lợi ích của việc sử dụng giao diện runnable. Câu hỏi của tôi là lợi thế của việc mở rộng từ lớp Thread là gì? Ưu điểm duy nhất mà tôi nghĩ đến là có thể mở rộng từ lớp Thread và giả sử gọi nó là lớp ThreadExtended. Sau đó, anh ta/cô ấy có thể thêm nhiều chức năng hơn trong ThreadExtended (mà tôi không biết điều đó có thể là gì), và sau đó khi anh/cô ấy muốn tạo một chủ đề, thay vì mở rộng từ lớp Thread, nó mở rộng từ ThreadExtended.

Có lợi thế nào khi sử dụng lớp Thread thay vì giao diện Runnable không? Bạn có biết bất kỳ lớp nào mở rộng từ lớp Thread và sau đó yêu cầu người dùng mở rộng từ các lớp đó nếu họ muốn có khả năng đa luồng?

public class ThreadExtended extends Thread{ 
    //override some functions || add more functionality to Thread class 
    } 

    public class MyThread extends ThreadExtended{ 
    public void run() 
    { 
    for(int i=0;i<10;i++) 
     { 
      System.out.println("Using ThreadExtended instead of Thread directly"); 
     } 
    } 

    public static void main(String args[]) 
    { 
    MyThread myThread = new MyThread(); 
    myThread.start(); 
    } 
    } 
+1

Chỉ có một cách để tạo một chuỗi trong java và đó là để khởi tạo một 'Thread' và gọi' start() 'trên nó. –

+0

@SotiriosDelimanolis Tôi hiểu rằng, tôi hỏi về việc mở rộng không instantiating – sheidaei

+0

Hãy chú ý đến câu hỏi tôi đã hỏi, nó hơi khác với một trong những bạn nghĩ rằng nó là bản sao của. Cảm ơn – sheidaei

Trả lời

7

Ít khi có lý do thuyết phục để mở rộng lớp Thread. Tôi sẽ tưởng tượng rằng trong hầu hết các trường hợp, bạn sẽ kết thúc chỉ cần ném tất cả các 'làm một số công cụ' logic vào phương pháp chạy anyway.

Bạn chắc chắn nên gắn bó với việc triển khai Runnable. Bằng cách chọn mở rộng Thread, bạn đang tạo một hệ thống phân cấp lớp có thể là vô nghĩa và sẽ giới hạn các tùy chọn của bạn để tái cấu trúc mọi thứ trong tương lai. Bằng cách chọn triển khai Runnable, bạn không yêu cầu dòng dõi của người triển khai là gì và bạn có thể sử dụng các trừu tượng mạnh mẽ như ExecutorService để trừu tượng hóa các hạt và bu lông chạy một đoạn mã. Cuối cùng, thích thực hiện một giao diện hơn là mở rộng một lớp là một thực hành tốt!

5

Lý do duy nhất để mở rộng Thread là nếu bạn cần thêm hành vi được liên kết với chính chuỗi đó, thay vì tác vụ mà chuỗi đang thực thi. Ví dụ, nếu bạn đang thực hiện một hồ bơi thread (mà không ai nên làm nữa, được đưa ra java.util.concurrent), bạn sẽ cần phải thay đổi hành vi của chủ đề để (1) nó có thể chấp nhận công việc mới, và (2) nó trở lại chính nó vào hồ bơi. Trong một hình thức rất đơn giản:

public void setRunnable(Runnable runnable) { 
    this.runnable = runnable; 
} 

public void run() { 
    while (true) { 
     // wait on lock 
     try { 
      this.runnable.run(); 
     } 
     catch (Throwable ex) { 
      // do something with exception 
     } 
     finally { 
      // return to pool 
     } 
    } 
} 
1

tôi thấy nó rõ ràng hơn để mở rộng Chủ đề nếu tôi cũng cấu hình các chủ đề, ví dụ:

class FileReaper extends Thread { 
    FileReaper() { 
     setDaemon(true); 
     setName(getClass().getSimpleName()); 
    } 

    @Override public void run() { 
     // do something 
    } 
} 
0

một cách đơn giản, khi bạn mở rộng chủ đề đó sẽ là lớp chỉ bạn sẽ được mở rộng từ!

0

Ngoài ra còn có một lý do chính đáng để mở rộng một Thread - nếu bạn muốn tạo một chủ đề Looper:

Đây là một ví dụ điển hình của việc thực hiện của một thread Looper, sử dụng tách chuẩn bị() và vòng lặp() để tạo ra một Handler ban đầu để giao tiếp với Looper.

class LooperThread extends Thread { 
     public Handler mHandler; 

     public void run() { 
      Looper.prepare(); 

      mHandler = new Handler() { 
       public void handleMessage(Message msg) { 
        // process incoming messages here 
       } 
      }; 

      Looper.loop(); 
     } 
    } 

Chuỗi giao diện người dùng là chủ đề Looper, nhưng bạn có thể tạo công nhân riêng của mình Chủ đề Looper. Để tìm hiểu cách Thread với một phương pháp Looper chạy phương thức loop() trên hành vi đó, hãy xem câu trả lời gần đây của tôi here.

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