Trong ngữ cảnh của Java, tôi tạo một luồng mới để đọc đầu vào mạng khi mở một cửa sổ GUI, và khi tôi đóng cửa sổ, tôi muốn giải phóng tài nguyên ổ cắm và chấm dứt chuỗi ngay lập tức. Bây giờ tôi đang sử dụng phương pháp setSoTimeout, nhưng tôi không muốn chờ đợi các ngoại lệ timeout. Ai có thể đưa ra một số gợi ý? Cảm ơn!Làm thế nào để chấm dứt một thread chặn trên hoạt động IO socket ngay lập tức?
Trả lời
Có (khả năng) ba cách để làm điều này:
Calling
Socket.close()
trên socket sẽ đóng liênInputStream
vàOutputStream
đối tượng, và gây ra bất kỳ đề chặn Socket hoặc (liên quan) dòng hoạt động để được bỏ chặn. Theo javadoc, các hoạt động trên chính socket sẽ ném mộtSocketException
.Gọi
Thread.interrupt()
sẽ (trong một số trường hợp không được chỉ định) sẽ làm gián đoạn hoạt động I/O chặn, khiến nó ném một sốInterruptedIOException
.Lưu ý báo trước. Rõ ràng cách tiếp cận "ngắt()" không hoạt động trên các nền tảng Java "hiện đại nhất". (Nếu ai đó có thời gian và độ nghiêng, họ có thể điều tra các trường hợp mà phương pháp này hoạt động. Tuy nhiên, thực tế là hành vi là nền tảng cụ thể nên đủ để nói rằng bạn chỉ nên sử dụng nó nếu bạn chỉ cần ứng dụng của bạn để làm việc trên một nền tảng cụ thể. Tại thời điểm đó, bạn có thể dễ dàng "thử" cho chính mình.)
Cách thứ ba có thể thực hiện là gọi
Socket.shutdownInput()
và/hoặcSocket.shutdownOutput()
. Các javadocs không nói rõ ràng những gì xảy ra với các hoạt động đọc và/hoặc ghi hiện đang bị chặn, nhưng nó không phải là không hợp lý khi nghĩ rằng chúng sẽ bỏ chặn và ném một ngoại lệ. Tuy nhiên, nếu javadoc không nói điều gì xảy ra thì hành vi đó sẽ được giả định là nền tảng cụ thể.
Xin vui lòng, trong những trường hợp nào sẽ thread.interrupt() làm gián đoạn một hoạt động I/O chặn? –
Xu DXn - nó không phải là tài liệu. Một số luồng thực hiện điều này, những luồng khác thì không. Để biết chi tiết đẫm máu, hãy đọc mã nguồn OpenJDK. Điểm tôi đang cố gắng tạo ra là nó có thể có hoặc không hoạt động. –
khá chắc chắn hầu hết các triển khai jvm làm _not_ hỗ trợ các hoạt động io gián đoạn. tôi nghĩ rằng có lẽ mặt trời solaris jvm hỗ trợ nó tại một thời điểm. – jtahlborn
Tôi biết câu hỏi này là cũ nhưng không ai dường như đã giải quyết được "bí ẩn" của Thread.interrupt()
trên "nền tảng hiện đại" tôi đã thực hiện một số nghiên cứu.
Điều này được kiểm tra trên Java 8 trên Windows7 (64-bit) (nhưng nó cũng có thể đúng đối với các nền tảng khác).
Calling Thread.interrupt()
không không ném một InterruptedIOException
gì xảy ra là phương pháp InputStream.read()
trả về với -1
và Thread.interrupted()
-flag được thiết lập.
Vì vậy, những điều sau đây có thể được coi là một 'điều chỉnh' read() ném InterruptedIOException
:
static final int read(Socket socket, byte[] inData)
throws SocketTimeoutException, // if setSoTimeout() was set and read timed out
InterruptedIOException, // if thread interrupted
IOException // other erors
{
InputStream in = socket.getInputStream();
int readBytes = in.read(inData, 0, inData.length);
if (Thread.interrupted())
{
throw new InterruptedIOException("Thread interrupted during socket read");
}
return readBytes;
}
Câu trả lời này xứng đáng được nhiều phiếu bầu hơn vì hành vi của Java khi bị gián đoạn trong các hoạt động của luồng đầu vào/đầu ra không phải là điều mà nhiều người mong đợi. –
- 1. Làm thế nào để tiêu diệt một chuỗi ngay lập tức trong C#?
- 2. Làm thế nào để kích hoạt NSTimer ngay lập tức?
- 3. scala actors vs thread và chặn IO
- 4. Làm thế nào để bạn di chuyển một CALayer ngay lập tức (không có hoạt ảnh)
- 5. C#: Làm thế nào để chấm dứt một socket trước Socket.BeginReceive gọi lại?
- 6. Làm thế nào để chấm dứt một sợi công nhân một cách chính xác trong C#
- 7. Tại sao chủ đề của tôi chấm dứt ngay lập tức sau khi hiển thị biểu mẫu Windows?
- 8. Làm thế nào để bạn hủy bỏ/chấm dứt hoạt động của Đầu bếp?
- 9. Làm thế nào để chấm dứt kết nối HttpWebRequest trong C#? Nó không hoạt động ngay cả thiết lập thời gian chờ hoặc readwritetimeout
- 10. Làm thế nào để hủy bỏ ngay lập tức một BackgroundWorker làm việc?
- 11. Làm cách nào để chấm dứt ứng dụng Android NDK (hoạt động gốc) một cách có lập trình?
- 12. pthread_cond_timedwait trả lại ngay lập tức
- 13. Làm thế nào để giải quyết rằng AttachAsync của một DownloadOperation không trở lại ngay lập tức?
- 14. làm thế nào để mô phỏng trường hợp bất thường cho lập trình socket/tcp trong linux, chẳng hạn như chấm dứt một bên của kết nối?
- 15. Làm cho hệ thống .Tây lửa.Timers.Timer cháy ngay lập tức
- 16. Làm thế nào để ngăn chặn cửa sổ đầu cuối đóng khi Linux Bash Script chấm dứt?
- 17. Eclipse: Tự động hoàn thành ngay lập tức
- 18. Làm thế nào để wordpress.com và các dịch vụ tương tự khác tạo ngay một tên miền phụ, tức là có sẵn ngay lập tức?
- 19. Thông báo chặn chặn JQuery BlockUI không hiển thị ngay lập tức
- 20. cửa sổ ngay lập tức
- 21. ios MapKit MKOverlayView hoạt hình xảy ra ngay lập tức
- 22. C# Thread.Sleep thức dậy ngay lập tức
- 23. Làm thế nào để bắt đầu vòng lặp setInterval ngay lập tức?
- 24. Gỡ lỗi mẫu ngay lập tức
- 25. cách tạo UIProgressView trên thay đổi UITableViewCell ngay lập tức?
- 26. Đánh giá ngay lập tức LaTeX
- 27. Tôi nên sử dụng mô-đun luồng nào để ngăn chặn đĩa IO chặn mạng IO?
- 28. Thin :: Server # daemonize thoát ngay lập tức
- 29. Làm cách nào để chấm dứt chuỗi trong C++ 11?
- 30. Làm thế nào để cho mô hình ng không cập nhật ngay lập tức?
Tôi không hiểu tại sao điều này có một -1?!? Tôi nghĩ câu hỏi khá rõ ràng và ngay tại chỗ. –