2016-01-22 15 views
16

Tôi biết rằng implements Runnable is preferred over extends Thread trong các chủ đề Java vì nó cho phép chúng tôi mở rộng một số lớp khác nếu cần. Nhưng nếu trường hợp này xảy ra, thì extends Thread cũng có những lợi thế riêng của nó trên implements Runnable và nếu có, những lợi thế này là gì?Tại sao 'mở rộng chuỗi' tồn tại, khi 'triển khai Runnable' là chiến thắng trong mọi trường hợp

+4

@proudandhonour: Có, tôi đã đọc câu trả lời cho câu hỏi đó, nhưng tất cả các câu trả lời đều giải thích cách 'triển khai' là tốt. Và thực ra những câu trả lời đó đã tạo ra câu hỏi này trong đầu tôi. – rahul

+1

@proudandhonour bạn có nhớ liên kết tới câu trả lời trả lời câu hỏi này không? Nó không có vẻ trong số đầu tiên. – djechlin

+0

xem xét trường hợp, khi bắt đầu chuỗi, bạn muốn thêm chi tiết của chuỗi cụ thể đó vào DB. Điều này khác với logic nghiệp vụ mà bạn có trong phương thức run(), do đó bạn muốn giữ nó riêng biệt. Do đó, bạn sẽ ghi đè cả phương thức start() và run() –

Trả lời

30

Vì đôi khi (hầu như không bao giờ, nhưng đôi khi) bạn muốn có thể thay đổi hành vi cơ bản của Thread.

Đó là thời điểm bạn cần mở rộng.

Bạn có thể thay đổi bằng cách ghi đè phương thức từ lớp Thread, bạn không thể thực hiện điều đó bằng cách triển khai một từ Runnable.

+6

Ví dụ [tại đây] (http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start- được gọi là/34905821 # 34905821) - người hỏi muốn biết chủ đề nào đã tạo/bắt đầu chủ đề này. Ghi đè hàm tạo và 'bắt đầu' để làm như vậy. – OldCurmudgeon

18

Trong 20 năm trở lên kể từ khi Java 1.0 được phát hành, mẫu được coi là mẫu thiết kế tốt đã thay đổi là gì. Tuy nhiên, Java cam kết khả năng tương thích ngược có nghĩa là mã cũ có thể sử dụng các mẫu thiết kế kém sẽ vẫn hoạt động.

Một trong những thú cưng của tôi là StringBuffer mà không bao giờ là ý tưởng hay để đồng bộ hóa phương pháp, được thay thế cách đây hơn hàng chục năm, nhưng rất tiếc các nhà phát triển không được ngăn sử dụng nó ngay hôm nay mặc dù nó không còn được dùng lâu nữa trước khi họ bắt đầu sử dụng Java.

+2

sự lựa chọn giữa việc ngăn chặn runnables và chủ đề không có gì để làm với "mẫu thiết kế", mà không làm cho bất kỳ ý nghĩa. Đây là hai trường hợp sử dụng khác nhau – specializt

+0

Các mẫu thiết kế là thành phần so với kế thừa. Hai trường hợp sử dụng khác nhau mà bạn có trong tâm trí là gì. Sub-classing 'Thread' là * rất hiếm khi * về việc ghi đè bất cứ điều gì nhưng' run() ' –

+0

bạn dường như nghĩ rằng một' Runnable' có liên quan đến 'Thread'. Vâng nó không phải là. Ở tất cả. Runnables đang chặn, thuật toán thực thi và chủ đề là không đồng bộ, độc lập mà vẫn có thể chạy lâu sau khi thread gọi đã kết thúc. Xin đừng viết câu trả lời về các chủ đề xa lạ với bạn, cảm ơn bạn rất nhiều. Câu hỏi này có thể được cải cách thành _ "Tốt hơn: cây trồng biến đổi gen hoặc mùa cuối cùng của việc phá vỡ xấu?" _ --- không tính toán. – specializt

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