Nếu tôi sẽ viết:Làm thế nào để phát hiện một cuộc gọi Selector.wakeup
int selectedChannels = selector.select(); Set selectedKeys = selector.selectedKeys(); if (selectedChannels != selectedKeys.size()) { // Selector.select() returned because of a call to Selector.wakeup() // so do synchronization. } // Continue with handling selected channels.
sẽ nó một cách chính xác phát hiện các wakeup-gọi?
Backgroundinformation:
Tôi đang viết một máy chủ mà hầu hết thời gian chỉ nhận được gói dữ liệu và lưu trữ chúng trong một tập tin. Rất hiếm khi ứng dụng có nhu cầu gửi cho chính nó một gói đặc biệt. Đối với điều này nó khởi tạo một kết nối (từ một thread khác nhau) vào socket server:
SocketChannel channel = SocketChannel.open(); channel.configureBlocking(false); channel.connect(new InetSocketAddress(InetAddress.getLocalHost(), PORT)); selector.wakeup(); SelectionKey key = channel.register(selector, SelectionKey.OP_CONNECT);
Vấn đề là SelectableChannel.register() có thể ngăn chặn nếu các chủ đề chính là đã có trong Selector.select(). Để ngăn chặn điều này xảy ra, tôi gọi Selector.wakeup() để cho thread chính trả về sớm từ select(). Để đảm bảo luồng khác có cơ hội hoàn thành cuộc gọi đăng ký, tôi sẽ phải đồng bộ hóa chủ đề chính, nhưng tôi sẽ phải thực hiện sau mỗi lần trả về từ select(). Nếu tôi có thể phát hiện xem nó trả về từ select() vì một cuộc gọi wakeup(), thì tôi có thể tối ưu hóa nó cho trường hợp này. Vì vậy, về mặt lý thuyết đoạn mã hàng đầu nên hoạt động, nhưng tôi đã tự hỏi liệu nó có chỉ làm như vậy, bởi vì nó dựa vào một số hành vi không xác định không? Không phải là điều đó.
Cảm ơn mọi gợi ý.
Động lực của bạn để tránh khóa là gì? Có phải bạn đang lo lắng về thời gian thực hiện hay bạn gọi select() ở nhiều nơi và muốn tránh trùng lặp mã? –
Tôi lo lắng về thời gian thực hiện, mặc dù đây có thể là điểm tranh luận vì select() và thanh ghi() đã đồng bộ hóa trên các khóa đã đăng ký. – BugSlayer
Đồng ý, đáng lo ngại về điều này ở đây là một ví dụ điển hình về tối ưu hóa sớm. Trừ khi bạn đang thực sự nói về dung sai micro giây duy nhất bạn sẽ không nhận thấy bất kỳ sự suy giảm nào. Tôi sẽ ném một câu trả lời bằng cách sử dụng khóa. –