2009-05-26 36 views

Trả lời

3

sự hiểu biết của tôi là thực hiện java được dựa trên chức năng c unix select() (tôi dường như nhớ rằng việc triển khai Windows là hơi khác nhau)

Tùy thuộc vào hệ điều hành (và args JVM!) Chức năng hệ điều hành có nguồn gốc khác nhau là được gọi, nhưng những gì họ có điểm chung là mã nguồn gốc của nó - chức năng cơ bản không được triển khai trong Java.

Nếu bạn muốn tạo một thư viện truy cập select() (hoặc tương tự) của hệ điều hành cơ sở (thực sự dựa vào tập tin), tôi nghĩ bạn buộc phải sử dụng JNI. Tôi không tin có bất kỳ cách nào xung quanh nó.

Bộ chọn/SelectableChannel trong Java thực sự là một tập con thiếu máu của những gì select() có thể thực hiện.

+0

Nói cách khác, không có cách nào để xác định SelectableChannel của riêng bạn? – Gili

+1

Đánh giá từ mã nguồn đến Selector và SelectableChannel Tôi không thể thấy bất kỳ cách nào xung quanh thực tế là nếu bạn muốn xác định SelectableChannel của riêng bạn, thì những gì bạn cần làm là viết (và đăng ký) một SelectorProvider mới cung cấp các triển khai mới của Selector và SelectableChannel (chúng cần được ghép nối) hỗ trợ chức năng mở rộng mà bạn muốn (sử dụng JNI hoặc một số phương thức khác). – Nuoji

+0

POE đã làm đúng! [POE :: Bộ lọc] (http://search.cpan.org/~rcaputo/POE/lib/POE/Filter.pm). – woky

2

Bạn có thể muốn mở rộng java.nio.channels.spi.AbstractSelectableChannel để tạo triển khai mà bạn cần. Nếu bạn đang yêu cầu một cái gì đó khác nhau, bạn cần phải đưa ra một câu hỏi chi tiết hơn. Mã nguồn JDK có thể tải xuống theo một vài giấy phép khác nhau, tùy thuộc vào phiên bản bạn đang tải xuống. Bạn có tùy chọn xem triển khai JDK (java.nio.channels.Channel, java.nio.channels.SocketChannel, v.v.) để hiểu đầy đủ những gì bạn cần triển khai. Tuy nhiên, nếu bạn làm điều này, hãy cẩn thận không sao chép mã từ nguồn JDK trừ khi bạn có thể tuân theo giấy phép của mã nguồn mà bạn đã tải xuống.

Cuốn sách Java NIO có thể giúp bạn.

+0

Làm cách nào để bạn có thể triển khai AbstractSelectableChannel khi bạn không có SelectorProvider? SelectableChannel.provider() có nghĩa vụ trả lại nhà cung cấp đã tạo kênh nhưng nhà cung cấp mặc định không thể tạo triển khai của bạn. – Gili

+0

Tôi đoán điểm của tôi là ở đâu đó dưới mui xe, ai đó phải gọi một mức chọn thấp() đối với các tệp xử lý. Nó không rõ ràng như thế nào SelectableChannel cung cấp Selector với các thông tin cần thiết để làm công việc của mình. Làm thế nào sau này có thể biết khi SelectableChannel của tôi đã sẵn sàng để đọc, viết, vv? – Gili

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