2010-03-19 9 views
12

Tôi hiểu InterruptedException là gì và tại sao nó được ném ra. Tuy nhiên trong ứng dụng của tôi tôi nhận được nó khi chờ đợi SwingUtilities.invokeAndWait() trên một sợi chỉ được biết đến bởi ứng dụng của tôi, và ứng dụng của tôi không bao giờ gọi Thread.interrupt() trên bất kỳ chủ đề nào, nó cũng không bao giờ chuyển tham chiếu của chuỗi cho bất kỳ ai.Ai ngắt chuỗi của tôi?

Vì vậy, câu hỏi của tôi là: Ai ngắt chuỗi của tôi?

Có cách nào để nói không? Có một lý do tại sao InterruptedException không chứa tên của Thread mà yêu cầu ngắt?

Tôi đọc mà nó có thể là một khuôn khổ hoặc thư viện mà thực hiện điều này, chúng tôi sử dụng những điều sau đây, nhưng tôi không thể nghĩ ra lý do để họ làm gián đoạn chủ đề của tôi:

  • Hibernate
  • Xuân
  • Log4J
  • nối
  • Mysql
+8

Tôi nghĩ bạn có nghĩa là "Ai * DARES * làm gián đoạn chuỗi của tôi?" –

+2

+1 - Bạn đang thực hiện Thread # join? nó ném InterruptedException. – RubyDubee

+0

Thật vậy Scott, tôi muốn các chủ đề của tôi không bị gián đoạn (vì tôi không muốn tuân thủ yêu cầu). Chúng tôi không làm Thread # tham gia chính mình, nhưng tôi có thể tưởng tượng rằng invokeAndWait sử dụng một cơ chế như vậy. Tuy nhiên, Thead # join có thể gọi ngắt trên một luồng khác không? Ngoài ra tôi khá chắc chắn rằng không ai chờ đợi cho thread của tôi để hoàn thành (vì nó sẽ không bao giờ). – Thirler

Trả lời

11

Nếu có thể, bạn có thể mở rộng Thread và ghi đè phương thức interrupt() cho chủ đề này để in ngăn xếp hoặc ném một ngoại lệ hoạt động không được hỗ trợ.

Bạn cũng có thể sử dụng lớp mở rộng Thread để lưu trữ tham chiếu đến chuỗi gián đoạn và đọc nó khi bạn bắt ngoại lệ bị gián đoạn.

2

có một cái gì đó kỳ lạ ở đây.

Từ javadoc của invokeAndWait, một InterruptedException được ném

nếu chúng ta đang bị gián đoạn trong khi chờ đợi sự kiện dispatching thread để kết thúc excecuting doRun.run()

Bạn đã cố gắng xem liệu mã được thực thi trong EDT có gửi bất kỳ ngoại lệ nào không? Hoặc làm mã trong đó EDT cố gắng sửa đổi một số biến của thread này (tôi biết thuật ngữ này không phải là "chính thống" trong ngôn ngữ java, nhưng tôi hi vọng bạn hiểu ý tôi là: bất kỳ mã nào ngụ ý đồng bộ, chờ, tham gia, ...

+0

Nếu Runnable chúng ta đang đợi ném một ngoại lệ, nó sẽ đưa ra một InvocationTargetException, đó không phải là trường hợp. Có thể chủ đề của chúng tôi có khóa trong khi chờ đợi, điều đó có thể gây ra nó không? Tôi chắc rằng chúng tôi không có bế tắc. Các chủ đề chúng tôi chờ đợi để tạo ra một hộp thoại mà chúng tôi sử dụng trong thread chờ đợi. – Thirler

4

Nói chung, nếu bạn muốn biết ai đang làm một cái gì đó, đính kèm một debugger, đặt một breakpoint, và có bạn đi. Không cần đoán nếu bạn có thể tái tạo nó!

Trong trường hợp này, bạn có thể Nếu có các chủ đề khác đang bị gián đoạn (vì vậy bạn có "số lần truy cập sai" trên điểm ngắt), bạn có thể thêm điều kiện điểm ngắt (hầu hết các IDE cho phép bạn thực hiện điều đó một cách dễ dàng), ví dụ kiểm tra tên của chủ đề.