2011-11-18 60 views
8

Có thể tiêu diệt sợi chỉ ở trạng thái RUNNING theo cách không theo chương trình?Làm thế nào để tiêu diệt một Thread trong Java đang ở trạng thái RUNNING?

Tôi biết rằng top lệnh trong *nix có thể hiển thị chuỗi. Tôi có thể giết luồng trong hệ điều hành không?

Tôi muốn biết nếu có cách nào để liên kết chuỗi với một quy trình để tôi chỉ có thể giết chỉ chuỗi đó chứ không phải ứng dụng.

Chúng tôi đã có một lỗi trong mã của chúng tôi đã giữ một luồng ở trạng thái RUNNING theo phương pháp được đồng bộ hóa. Chủ đề giữ lock trên đối tượng "treo" ứng dụng.

Lỗi đã được sửa. Nhưng tôi tự hỏi nếu có thể.

+2

nếu bạn có một pid bạn có thể giết nó! – hovanessyan

+0

chỉ tìm giải pháp trên * nix hay không? –

+0

ProcessExplorer trên các cửa sổ có thể giết các chủ đề riêng lẻ, vì vậy có, điều đó là có thể. có lẽ trên unix quá. –

Trả lời

9

Câu trả lời ngắn gọn là "có thể, nhưng bạn không nên và hầu hết thời gian nó sẽ không hoạt động".

Câu trả lời dài là:

"Có lẽ ..." Một số thực hiện JVM đồ java đề để đề hệ điều hành và một số thì không. Nếu JVM thực hiện ánh xạ tới một chuỗi hệ điều hành gốc, bạn có thể hủy chuỗi đó bằng một số công cụ xử lý mà hệ điều hành cung cấp (như kill trên * nix). Nếu JVM thực hiện các luồng màu xanh lá cây, có nghĩa là nó không ánh xạ một chuỗi Java tới một luồng mức hệ điều hành, thì về cơ bản bạn sẽ không may mắn bằng cách sử dụng các công cụ mức OS. May mắn là chỉ có rất ít JVM triển khai thực hiện điều này. Một cách tiếp cận có thể được sử dụng bất kể cách mà JVM tổ chức các luồng của nó, đang sử dụng trình gỡ lỗi java. Bài viết này mô tả quy trình thực hiện: http://www.rhcedan.com/2010/06/22/killing-a-java-thread/.

"nhưng bạn không nên làm điều đó" Giết chết một thread trên cấp hệ điều hành gần như chắc chắn sẽ rời khỏi JVM trong tình trạng không xác định (đọc "JVM có thể sụp đổ hoặc xóa tất cả các tập tin trên đĩa cứng của bạn hoặc làm bất cứ điều gì nó fricking vui lòng làm "). Ngay cả khi đi theo trình gỡ rối, chỉ một số lượng rất nhỏ các ứng dụng java (đọc "không có ứng dụng nào được thực hiện trên hành tinh này") sẽ xử lý đúng sự kiện là một ứng dụng bên ngoài đang giết chết một trong các chủ đề của nó. Kết quả là các ứng dụng này sẽ được đặt trong trạng thái không xác định (đọc "ứng dụng có thể bị lỗi hoặc xóa tất cả các tệp trên đĩa của bạn hoặc làm bất cứ điều gì mà bạn thích làm").

"và hầu hết thời gian nó sẽ không làm việc, hoặc" Nếu thread đang thực sự khó khăn với một số bị chặn IO vv, sau đó giết chết các chủ đề sẽ không hoạt động, nó sẽ chỉ không trả lời. Nếu một chương trình bị kẹt thì có lẽ tốt hơn là nên giết toàn bộ chương trình, tìm ra vấn đề với chương trình và sửa nó thay vì giết một luồng đơn lẻ.

+0

Tôi biết nó không phải là cách. Chỉ là tự hỏi. Cảm ơn câu trả lời của bạn. – ssedano

0

Thread.interrupt phương pháp để yêu cầu tắt máy a thread ..
Hoặc nếu u đang sử dụng một hồ bơi thread sau đó executorService.shutdown() and executorService.shutdownNow() should be used to shutdown the thread

+1

OP yêu cầu một cách tiếp cận phi theo chương trình. –

1

Trên Linux , có một lệnh tkill(int tid, int sig), tương tự như kill.

Trên cửa sổ, ProcessExplorer có thể làm điều đó từ gui, không biết nếu có bất kỳ điều gì với cli.

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