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ủ?
Trả lời
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.
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ì.
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.
Hãy nhớ để cờ chết là loại 'AtomicBoolean' hoặc ít nhất là dễ bay hơi. – aioobe
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.
- 1. Tắt biểu tượng GPS khi LocationListener đang ngủ
- 2. Tắt ứng dụng đa luồng
- 3. Thread.Interrupt để ngừng ngủ dài khi tắt ứng dụng - Có cách tiếp cận tốt hơn
- 4. Ngăn máy tính bảng ngủ khi ứng dụng đang chạy
- 5. Chạy ứng dụng IPhone khi đang ở chế độ ngủ
- 6. Hộp âm đạo bị hỏng sau khi ngủ/tắt máy
- 7. Ngủ trong vòng lặp khi ứng dụng đang chạy, nhưng ngủ quá ít
- 8. Làm cho chương trình java ngủ mà không cần luồng
- 9. Cập nhật một ObservableCollection trong một luồng riêng biệt
- 10. Một MediaPlayer có nên chạy trong chuỗi riêng biệt không?
- 11. Diễn viên đang ngủ?
- 12. Lợi ích của ThreadGroup trong java khi tạo các luồng riêng biệt là gì?
- 13. Các luồng Java đang chờ khóa đối tượng không bị khóa (hiển nhiên) bị khóa
- 14. Luồng có vị trí viết và đọc riêng biệt
- 15. Tắt ứng dụng Graceful khi Windows tắt
- 16. Quản lý luồng và luồng ứng dụng Java
- 17. Android - Tôi có thể tắt tiếng hiện đang phát các ứng dụng âm thanh không?
- 18. Tắt chế độ không hoạt động trong khi ứng dụng iOS đang chạy
- 19. EF: Tự động di chuyển đang chạy khi bị tắt
- 20. Đăng nhập vào ứng dụng đa luồng trong java
- 21. onOrientationChanged() đang được gọi khi OrientationEventListener bị tắt
- 22. Ứng dụng HTML5 dành cho thiết bị di động đang chạy khi màn hình điện thoại tắt?
- 23. Tôi có thể phát hiện khi một Chủ đề nền bị giết bởi ứng dụng khi ứng dụng đóng không?
- 24. Mỗi luồng có ngăn xếp riêng không?
- 25. Tắt ứng dụng một cách duyên dáng khi mất điện
- 26. Xử lý NFC khi điện thoại đang ngủ trong Android
- 27. Nén hình ảnh không bị mất khi đang bay
- 28. Làm thế nào để dừng các luồng khi không triển khai ứng dụng Java EE?
- 29. Java: Làm thế nào để bắt InterruptedException trên một sợi, khi bị gián đoạn bởi một luồng khác?
- 30. Tắt hiển thị Android khi đang sạc
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