2011-02-07 31 views
5

Ví dụ: nếu tôi có một chương trình dòng lệnh java sinh ra một chuỗi mới (thread # 2) để thực hiện một số cuộc thăm dò ý kiến, và sau đó ngủ trong 5 phút. trong khi thread chính (thread # 1) của chương trình đang chạy và sau đó kết thúc trước 5 phút từ thread # 2, vì vậy chương trình sẽ thoát. Có vấn đề gì với điều này không? Tôi có nên ngắt Thread # 2 trong Thread # 1 trước khi kết thúc chức năng chính trong chương trình này không?Ứng dụng java có bị tắt không khi một luồng riêng biệt đang ngủ?

+1

Chương trình không kết thúc đơn giản vì chức năng chính bị chấm dứt. Tất cả các chủ đề không phải daemon phải chấm dứt cho chương trình tự kết thúc bình thường. – ILMTitan

Trả lời

2

Nó có thể được coi là thực hành không tốt và một dấu hiệu của thiết kế kém của một số, nhưng trong chính không nên có bất kỳ vấn đề để chấm dứt JVM với System.exit. Không phải nếu không có việc làm sạch sẽ được thực hiện bởi Chủ đề số 2.

Một vấn đề khác là liệu Chủ đề số 2 có thể ở giữa một số hành động hay không.

+0

Ngoài ra, nếu một chuỗi có thể được an toàn "giết" bất cứ lúc nào, nó có thể (hoặc thực sự nên) được đánh dấu là daemon. – biziclop

+0

@biziciop, điểm tốt. – aioobe

0

Nó phụ thuộc hoàn toàn vào những gì nó đang làm. Khi chương trình thoát, quá trình sẽ chấm dứt, lấy bất kỳ chủ đề bổ sung nào với nó. Vấn đề tiềm năng duy nhất là nếu Thread # 2 nắm giữ một số xử lý tài nguyên. Tuy nhiên, nếu tất cả những gì nó đang làm là đọc, thì bạn không nên có vấn đề gì.

0

Chủ đề không phải deamon tiếp tục chạy ở chế độ nền sau khi hoàn thành quá trình thực thi.
Kết quả là bạn sẽ có chủ đề treo trừ khi bạn rõ ràng gọi System.exit sẽ giết tất cả các chuỗi.
Cách tiếp cận tốt nhất mặc dù là dừng chuỗi # 2.
Chỉ cần sử dụng cờ trạng thái, ví dụ: boolean die trong chuỗi số 2.
Chủ đề số 1 sẽ làm gián đoạn luồng # 2, luồng # 2 sau đó sẽ thấy cờ chết (được đặt theo chuỗi # 1) được đặt thành true, sẽ làm bất kỳ việc dọn dẹp nào cần thiết và thoát ra một cách duyên dáng.
Trong trường hợp của bạn mà thread # 2 chỉ ngủ trong 5 phút và không làm bất cứ điều gì nó sẽ được sử dụng tốt.

+0

Hãy nhớ để cờ chết là loại 'AtomicBoolean' hoặc ít nhất là dễ bay hơi. – aioobe

0

Hãy xem here.

Để chấm dứt chương trình java, tất cả các chuỗi không phải daemon đều phải chấm dứt trước tiên.
Khi tất cả các chủ đề không phải daemon ngừng thực thi, JVM sẽ tiêu diệt tất cả các chuỗi daemon và do đó sẽ bị tắt.

Trong trường hợp của bạn, sẽ không có bất kỳ vấn đề gì, trừ khi và cho đến khi Thread #2 của bạn đang thực hiện một số chức năng quan trọng như xử lý tài nguyên.

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