2011-08-15 28 views
36

Tôi biết rằng chủ đề nền Deamon chủ đề. Chúng ta có thể tạo chủ đề daemon của riêng mình bằng cách gọi setDaemon(true).Khi nào các chủ đề daemon hữu ích?

Câu hỏi của tôi là: tại sao và khi nào chúng ta cần tạo chuỗi của mình làm chuỗi daemon?

Trả lời

43

JVM thoát khi tất cả các chuỗi đang chạy là các chuỗi daemon. Vì vậy, hãy tưởng tượng bạn đang viết một trò chơi đơn giản, nơi phương pháp chính của bạn lặp lại cho đến khi bạn quyết định bỏ thuốc lá. Và hãy tưởng tượng rằng khi bắt đầu trò chơi, bạn bắt đầu một chuỗi sẽ thăm dò không ngừng một số trang web để kích hoạt cảnh báo. Bạn muốn JVM thoát ra khi bạn quyết định kết thúc trò chơi. Bạn không muốn bỏ phiếu bất tận để ngăn trò chơi kết thúc. Vì vậy, bạn làm cho chủ đề bỏ phiếu này một chủ đề daemon.

+0

Trong ví dụ của bạn, khi người dùng quyết định kết thúc trò chơi, khối JVM sẽ bị chặn nếu có chủ đề người dùng (và không phải chuỗi chủ đề) vẫn đang chạy? – Kal

+0

@Kal: Vâng, đó là cách nó hoạt động. Các luồng người dùng sẽ giữ cho JVM không hoạt động. –

+1

Có: nếu phương thức chính chỉ trả về, JVM sẽ tiếp tục chạy. Tất nhiên, nếu bạn gọi System.exit, nó sẽ ngừng chạy. –

10

Một chuỗi Deamon được tự động chấm dứt bởi JVM khi tất cả các chuỗi "bình thường" được chấm dứt. Các luồng thông thường không bao giờ được tự động chấm dứt.

4

Dịch vụ mà bạn muốn cung cấp cho người tiêu dùng của mình mà không có bất kỳ tương tác người dùng nào theo cách chủ yếu của người dùng tạo thành trường hợp sử dụng chính để đặt chuỗi người dùng làm daemon.

Kết quả là, cho đến khi luồng người dùng tồn tại các gurantees JVM mà các chuỗi daemon chạy liên tục. Bạn có thể tìm thấy các ví dụ như GC, UI Thread vv .. đó là những daemon.

Hy vọng điều đó sẽ hữu ích.

1

Thông thường chương trình chấm dứt khi tất cả các chủ đề của nó thoát khỏi phương thức run() của chúng. Các chuỗi Daemon không ngăn chương trình chấm dứt ngay cả khi chúng vẫn đang chạy, tức là thực hiện run().

Vì vậy, bạn nên sử dụng chuỗi daemon nếu bạn không muốn ngăn chặn chương trình chấm dứt khi luồng vẫn đang chạy. Nó là điển hình cho ví dụ cho các nhiệm vụ định kỳ trong thời gian dài nhưng thực sự phụ thuộc rất nhiều vào chương trình của bạn, thiết kế và sở thích của bạn.

2

Như đã chỉ ra khác, một chuỗi daemon không ngăn không cho JVM thoát khi chương trình kết thúc khi chuỗi này vẫn đang chạy.

Nói chung, bạn không muốn tạo chủ đề daemon, trừ khi bạn hoàn toàn chắc chắn luồng không có tác dụng phụ. Vì bạn không thể biết khi nào luồng dừng lại, các khối finalizer không được chạy, cũng không phải bất kỳ stack nào được mở. Vì vậy, hãy thử tránh sử dụng các hoạt động IO trong các chuỗi daemon vì nó có thể làm hỏng dữ liệu.

0

Tôi đã sử dụng chúng với Bộ hẹn giờ để xóa các tệp không thể xóa ngay lập tức. Tức là, tôi tạo ra các tệp .exe, chạy và sau đó xóa chúng. Nhưng có 50% cơ hội rằng executable.delete không thành công, dường như vì hình ảnh vẫn bị chặn bởi quá trình chấm dứt. Bạn chỉ có thể xóa hình ảnh thực thi một cách đáng tin cậy sau khi quá trình hoàn tất. Nhưng, bạn không bao giờ biết phải mất bao lâu. Bạn đặt .deleteOnExit do đó thay vì .delete. Nhưng, bạn không muốn đợi cho đến khi máy java chấm dứt. Có thể mất rất nhiều thời gian và bạn không muốn hàng triệu tệp .exe vô dụng ngu ngốc, mà bạn không cần nữa, treo trong hệ thống tệp. Do đó bạn lên lịch thực thi.delete trong bộ đếm thời gian để xảy ra một hai giây sau đó. Tuy nhiên, bộ hẹn giờ không thể là luồng thông thường. Nếu nó là như vậy, nó sẽ chặn chương trình của bạn từ chấm dứt ngay cả khi không có tập tin để xóa. Tôi có thể dễ dàng làm cho nó daemon tuy nhiên bởi vì cho dù các tập tin của tôi bị xóa hoặc không theo bộ đếm thời gian là không quan trọng - các tập tin sẽ được gỡ bỏ một trong hai cách: hoặc bằng daemon hoặc java thoát. Tôi nghĩ rằng nó là hoàn hảo sử dụng daemon.

0

Chuỗi chủ đề trong Java giống như một nhà cung cấp dịch vụ cho các chủ đề hoặc đối tượng khác đang chạy trong cùng một quy trình với chuỗi chủ đề. Daemon chủ đề được sử dụng cho các nhiệm vụ hỗ trợ nền và chỉ cần thiết trong khi các chủ đề bình thường đang thực hiện.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 chuỗi daemon thì các trình thông dịch sẽ thoát.

Khi tạo chuỗi mới, nó thừa hưởng trạng thái daemon của cha mẹ. Chủ đề và chuỗi daemon bình thường khác nhau về những gì xảy ra khi chúng thoát. Khi JVM dừng bất kỳ chủ đề daemon còn lại nào bị hủy bỏ: cuối cùng các khối không được thực thi, các 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

cố gắng tránh sử dụng các hoạt động IO trong các chủ đề daemon vì nó có thể bị hỏng dữ liệu. –

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