Tôi có một câu hỏi cơ bản. Tại sao và như thế nào phương thức đăng ký SelectableChannel có thể chặn cuộc gọi. Hãy để tôi cung cấp một kịch bản.Chặn chuỗi Java khi đăng ký kênh có bộ chọn trong khi chọn() được gọi. Phải làm gì?
Tôi đã tạo đối tượng Selector trong lớp Đăng ký như sau.
private static Selector selector = Selector.open();
Tôi cũng có phương thức trong cùng một lớp (Đăng ký) để đăng ký kênh bằng bộ chọn.
public static SelectionKey registerChannel(SelectableChannel channel,
int ops) throws IOException {
channel.configureBlocking(false);
return channel.register(selector, ops);
}
Và có một lớp khác có tên Yêu cầu, có phương thức đọc dữ liệu từ kênh, quy trình và cuộc gọi theo phương pháp đăng ký kênh.
selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
Tại thời điểm này, luồng bị chặn, không cho biết đầu mối của nó đang chờ đợi điều gì. Tôi đã xác minh rằng bộ chọn đang mở. Vui lòng cung cấp cho tôi một số trợ giúp để hiểu cách tôi có thể giải quyết vấn đề này. Có khóa nào mà tôi có thể thả ra không.
Bất kỳ đầu vào nào cũng sẽ được đánh giá cao.
Thêm vào những gì tôi đã mô tả. Các thử nghiệm khác cho thấy rằng nếu phương thức Register.register được gọi từ cùng một luồng, nó có thể đăng ký nhưng sau đó nếu một số luồng khác cố gắng gọi phương thức, thì luồng không di chuyển về phía trước.
+1 cho mẫu mã. Tôi thứ hai, từ kinh nghiệm. Thực hiện tốt. – casey
Điều này cho biết thêm tối đa 500 ms độ trễ không cần thiết cho mỗi đăng ký. Thay vào đó, hãy sử dụng phương pháp này trong http://stackoverflow.com/a/2179612/448970. –
@DavidB. Nó không thêm bất kỳ độ trễ nào cho mỗi đăng ký. Đây là chuỗi chọn để chặn tối đa 500ms, không phải chuỗi đăng ký và chuỗi chọn sẽ luôn muốn chặn trong 'select()'. Các tuyên bố trong câu trả lời bạn hầu như không chính xác. – EJP