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
Trả lời
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
.
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
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.
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
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() ' –
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
- 1. Tại sao "triển khai Runnable" được ưu tiên hơn "mở rộng Thread"?
- 2. tại sao runnable của tôi cho ANR?
- 3. Tìm kiếm triển khai "tại" có thể mở rộng
- 4. Tại sao bool.TrueString và bool.FalseString tồn tại?
- 5. Tại sao Console.Out.WriteLine tồn tại?
- 6. Kịch bản mở rộng lớp Thread và triển khai giao diện Runnable
- 7. Tại sao HashMap triển khai Bản đồ nếu nó mở rộng AbstractMap?
- 8. Tại sao tôi không thể mở rộng túi của mọi người trong nowjs?
- 9. Tại sao SingletonSet không triển khai SortedSet
- 10. Generics Java - tại sao "mở rộng T" được phép nhưng không "triển khai T"?
- 11. Biến thể trường hợp tồn tại?
- 12. Tại sao Ant trả lại 403 khi triển khai?
- 13. Tại sao HttpServlet triển khai Serializable?
- 14. Tại sao không phải là andalso/2 được triển khai như một BIF phù hợp?
- 15. Tại sao các trường hợp chỉ mở rộng Sản phẩm chứ không phải Product1, Product2, ..., ProductN?
- 16. triển khai "cập nhật nếu tồn tại" trong Doctrine ORM
- 17. Tại sao Node.js có thể mở rộng?
- 18. Tại sao HttpSessionState không triển khai IDictionary?
- 19. Trên ruby, tại sao bao gồm riêng tư và mở rộng là công khai?
- 20. Tại sao biểu tượng chiến thắng hiển thị khác nhau trên cùng màn hình 4k
- 21. Tại sao OCaml đôi khi yêu cầu mở rộng eta?
- 22. Tại sao Python mở rộng đầu ra [[...]]
- 23. DialogPage - mảng chuỗi không tồn tại
- 24. Tại sao PostgreSQL mặc định mọi thứ trong trường hợp thấp hơn?
- 25. Tại sao mở rộng ImageView được đánh dấu là lỗi?
- 26. Chiến lược để triển khai máy chủ trò chuyện có thể mở rộng
- 27. Tại sao Enumerable.Range triển khai IDisposable?
- 28. Tại sao mọi người nói rằng Java có khả năng mở rộng hơn so với python?
- 29. tại sao KHÔNG MỌI MỌI mặc định là UTF-8?
- 30. Tại sao cuối cùng là lớp Chuỗi?
@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
@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
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() –