2012-03-11 28 views
7

sẽ thoát khỏi luồng chính trước khi các chuỗi con hoàn thành quá trình thực hiện?sẽ thoát khỏi luồng chính trước khi các chuỗi con hoàn thành quá trình thực hiện?

tôi đọc trong 2 bài viết

http://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/thread-management.html

trong bài viết ở trên, Trong "Chủ đề Chấm dứt" para, nó khẳng định trong Red "nếu thread cha mẹ chấm dứt, tất cả các chủ đề con của nó chấm dứt là tốt. "

http://www.roseindia.net/java/thread/overview-of-thread.shtml

trong bài viết ở trên, dòng cuối cùng trong rằng các quốc gia trang "The main() phương pháp thực hiện có thể hoàn thành, nhưng chương trình sẽ tiếp tục chạy cho đến khi tất cả các chủ đề có hoàn thực hiện của nó.".

i phí họ mâu thuẫn. nếu tôi sai, xin vui lòng các chuyên gia sửa tôi.

Trong chương trình của tôi, một chương trình có phương thức Main gọi hàm tạo của 2 luồng. trong hàm tạo của các chủ đề tương ứng, tôi có phương thức start().

tôi muốn biết điều gì xảy ra, chủ đề chính chấm dứt trước khi chủ đề con hoàn thành quá trình thực thi? nếu như vậy, các chủ đề con anyway, tiếp tục thực hiện của họ ??

tôi đã thử chạy chương trình, một số lần tất cả các chuỗi con đang được thực thi hoàn chỉnh ngay cả khi thoát khỏi chuỗi chính. Trong 2 chủ đề, tôi đang xử lý một số tệp. trong testA thread Một mình, 1 tập tin một mình không được xử lý một số lần. nhưng nhiều lần, tất cả các tệp đang được xử lý và tôi không có bất kỳ vấn đề nào.

Trả lời

20

Java phân biệt giữa chuỗi người dùng và loại chủ đề khác được gọi là chuỗi daemon. Sự khác biệt giữa hai loại luồng này là nếu JVM xác định rằng các luồng chỉ chạy trong một ứng dụng là các chuỗi daemon (tức là, không có chủ đề người dùng), thời gian chạy Java đóng ứng dụng. Mặt khác, nếu ít nhất một luồng người dùng còn hoạt động, thời gian chạy Java sẽ không chấm dứt ứng dụng của bạn.

Khi phương thức main() của bạn ban đầu nhận điều khiển từ thời gian chạy Java, nó thực thi trong ngữ cảnh của một chuỗi người dùng. Miễn là luồng chính hoặc bất kỳ luồng người dùng nào khác vẫn còn sống, ứng dụng của bạn sẽ tiếp tục thực thi.

Trong trường hợp của bạn, chủ đề là chuỗi người dùng và do đó được phép hoàn thành trước khi thoát khỏi chuỗi chính.

tôi đang xử lý một số tệp. trong testA thread Một mình, 1 tập tin một mình là không được xử lý một số lần. nhưng nhiều lần

Lý do ở trên có thể khác hơn là thoát khỏi chuỗi. Nó có thể là khóa tập tin, vấn đề đồng bộ hóa, vv

Từ Java Thread API documentation:

Khi một Java Virtual Machine khởi động, thường có một đĩa đơn chủ đề phi daemon (mà thường gọi là phương thức có tên chính của một số lớp được chỉ định).Máy ảo Java tiếp tục thực hiện các chủ đề cho đến khi một trong các điều sau xảy ra:

Phương thức thoát của lớp Thời gian chạy đã được gọi và quản lý hoạt động xuất cảnh đã được thực hiện. Tất cả các chủ đề không phải là chủ đề daemon đã chết, hoặc bằng cách trở về từ cuộc gọi đến phương thức chạy hoặc bằng cách ném một ngoại lệ tuyên truyền ngoài phương thức chạy.

+0

Cảm ơn bạn đã giải thích chi tiết. bạn đã đề cập rằng "Trong trường hợp của bạn, các chủ đề là chủ đề người dùng và do đó được phép hoàn thành trước khi thoát khỏi chủ đề chính." Ở đây bạn có nghĩa là "chủ đề chính" là thời gian chạy Java không phải là chương trình với phương thức main(). chính xác? – user1257836

+0

lớp có phương thức chính và luồng được tạo bên trong phương thức chính là tất cả các luồng người dùng. tất cả các chủ đề này độc lập được thực thi đồng thời. Bởi vì tôi đã cho System.out.println ("thoát khỏi phương thức chính"); ở cuối phương thức chính. điều này được in trước system.out.println() trong các chủ đề con. điều này làm cho tôi nghĩ rằng các chủ đề chính (lớp có phương pháp chính) có thể thoát ngay cả trước khi các chủ đề con. đó là cách hành xử tốt và chính xác? – user1257836

+0

bạn có thể làm rõ ý nghĩa của khóa tập tin? cảm ơn trước!! – user1257836

2

Khi chủ đề chính thoát, phải mất con với nó. Có lẽ bằng cách "kết thúc" bài viết thứ hai chỉ đơn giản có nghĩa là không có hoạt động nào khác ngoài việc chờ đợi trẻ em. Khi chủ đề chính gọi System.exit (0); nó kết thúc - mọi cơ thể đều chết.

Giả sử bạn có hai luồng đang chạy: threadA và threadB. trong phương pháp chính. Các mã đầu tiên là cách tốt đẹp của chấm dứt thread - chỉ là một trong nhiều cách:

threadA.start(); 
threadB.start(); 
final long intercept = 300; 
long startTime = System.currentTimeMillis(); 
while (threadA.isAlive() && mis.isAlive()) { 
    threadA.join(intercept); 
if (System.currentTimeMillis() - startTime > intercept) { 
    threadB.interrupt(); 
    threadA.interrupt(); 
    threadA.join(); 
} 
} 
System.exit(0); 

Dưới đây là một cách đột ngột giết chết tất cả các chủ đề từ bên trong chính:

System.exit(0); 
+0

Cảm ơn bạn đã phản hồi. Tôi không bao giờ được sử dụng System.exit (0) trong chương trình của tôi. "Một khi các chủ đề chính thoát, nó sẽ đưa trẻ em với nó" .am vẫn không rõ ràng. chương trình có phương thức chính tạo 2 luồng và nó được hoàn thành.nhưng các chủ đề con được sinh ra sẽ tiếp tục, điều đó có đúng không? – user1257836

3

Luồng tiến trình nền sẽ tiếp tục chạy, ngay cả khi chuỗi CHÍNH hoàn thành.

Nếu bạn muốn CHÍNH ngăn chặn chúng (ví dụ, khi MAIN hoàn tất), hãy đặt MAIN của bạn là biến cờ "tiếp tục chạy" (mà bạn phải đặt là "dễ bay hơi"). MAIN đặt nó thành false (biến) hoặc null (đối tượng) khi MAIN muốn ngăn chặn chúng. Khi nó là false hoặc null, thì thread phải "return;".

Điều này hơi phức tạp để thực hiện, có nhiều cách, nhưng dễ nhất là làm cho Runnable của bạn trở thành lớp bên trong, để Runnable của bạn dễ dàng chia sẻ cờ.

Để triển khai tốt nhất, hãy tìm kiếm kỹ thuật này trong các thói quen bắt đầu/dừng của các ứng dụng Java.

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