2009-02-26 43 views
56

Tùy chọn nào cho async io (dựa trên socket) có trong java khác rồi java.nio? Cũng java.nio sử dụng chủ đề trong backround (như tôi nghĩ. NET async-socket-thư viện nào, có thể nó đã được thay đổi) hoặc là nó "true" async io bằng cách sử dụng một cuộc gọi chọn thích hợp?IO không đồng bộ trong Java?

+6

Trường hợp luồng cơ bản hỗ trợ nó,.NET sử dụng các cổng hoàn thành IO và luồng ThreadPool để thực hiện các cuộc gọi lại. –

+0

Jon, khi nào luồng cơ bản KHÔNG hỗ trợ? –

+0

Bất kỳ lý do cụ thể nào về việc tại sao không sử dụng java.nio? Trên thực tế, tôi đang cố gắng để thực hiện một số i/o không đồng bộ trong dự án của tôi tại nơi làm việc và tôi đã không sử dụng một trong những điều này trước đây. Do đó muốn biết. Cảm ơn. – Bhushan

Trả lời

44

Gói NIO của Java (tính bằng Java6), cung cấp hỗ trợ cho không chặn I/O chỉ, qua Selector s. Java7 hy vọng sẽ đi kèm với NIO.2, bao gồm hỗ trợ I/O không đồng bộ. Ngày nay, đặt cược tốt nhất của bạn là sử dụng một khung công tác. ARMistice đề cập đến Mina. Dưới đây là một số người khác.

  1. Grizzly. Đây là lõi I/O cho máy chủ GlassFish của Sun. Grizzly cung cấp một cơ sở cho việc đọc/ghi không đồng bộ (thông qua một mô hình hàng đợi). Nó hỗ trợ TCP và UDP. Tôi đã sử dụng Grizzly trong một vài dự án. Có những điều tôi thích và không thích về khung công tác, nhưng chi tiết đây thực sự là một chủ đề khác. Tôi sẽ nói rằng nó khá dễ dàng để có được một cái gì đó và chạy và Grizzly làm rất nhiều việc nâng nặng cho bạn.
  2. Netty. Dự án này xuất phát từ một trong những tác giả gốc của dự án Mina. Tôi đã không sử dụng này vì vậy tôi không biết về về sự hỗ trợ của nó cho I/O không đồng bộ. Bạn nên xem xét.

Bây giờ, liên quan đến câu hỏi của bạn về chủ đề, Bộ chọn NIO không sử dụng chủ đề cho I/O không chặn. Trong JDK6, họ sử dụng chọn() trong Windows và cơ sở epoll trên hạt nhân Linux mới hơn. Đối với I/O không đồng bộ, chi tiết luồng phụ thuộc vào khung công tác.

+1

NIO của Java cũng hỗ trợ chặn IO. ;) –

+1

Netty là không đồng bộ và hướng sự kiện như MINA. Kiểm tra các lời chứng thực và báo cáo hiệu suất được viết bởi người dùng thực trong trang chủ. :) – trustin

+0

Dường như Java 7 đã thực sự phát hành với I/O không đồng bộ: http://openjdk.java.net/projects/nio/presentations/TS-5686.pdf –

12

java.nio chỉ là một gói - một tập hợp các lớp "câm" - tự nó không sử dụng bất kỳ chủ đề nào. Khi được sử dụng đúng cách, chẳng hạn như trong Reactor design pattern, bạn có thể đạt được I/O không đồng bộ, có thể mở rộng, không đồng bộ.

+0

Câu trả lời của bạn có vẻ hợp pháp với tôi, nhưng bạn có thể giải thích thêm? Xin hãy giải thích thêm một chút. –

6

Nếu bạn quan tâm đến việc sử dụng nó cho Nội dung mạng. Một sự lựa chọn thực sự tốt là:

http://mina.apache.org/

Có một cái nhìn có dễ dàng để sử dụng và rất mạnh mẽ.

15

Một đề xuất khác liên quan đến libs sẽ là Naga (http://naga.googlecode.com). Nó hơi giống một khuôn khổ và giống một thư viện hơn. Nó cố gắng trông giống như các ổ cắm java thông thường, nếu đó là tách trà của bạn. Đó là tối giản so với Grizzly, Mina và Netty.

+0

Naga thực sự có vẻ giống như một wrapper rất đẹp xung quanh các công cụ không đồng bộ. –

+1

Nếu bạn chỉ muốn làm I/O Socket không đồng bộ mà không có một khung làm việc theo cách của bạn, Naga là những gì bạn muốn. – poindexter

+1

Naga có hoạt động tốt dưới Dalvik/android không? –

2

Đối với câu hỏi ban đầu, việc triển khai chỉ tiêu thụ một luồng cho mỗi hoạt động I/O trong một trường hợp, AsynchronousFileChannel trên các hệ thống Unix/Linux.

16

JAVA 7 đến câu trả lời mới là NIO.2 với lớp Tương lai. Ví dụ:

Về phía server:

final AsynchronousServerSocketChannel serverSocket= 
    AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection 
Future<AsynchronousSocketChannel> future= serverSocket.accept(); 
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled() 

//Do whatever you want .. 
InputStream stream = Channels.newInputStream(clientSocket) (...) 

Về phía khách hàng:

AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open(); 
Future connected = localSocket.connect(ourServerSocketAddress); 
// later: if(future.isDone()) 
connected.get(); 

//Send something 
OutputStream os = Channels.newOutputStream(clientChannel); 
os.write (...) 

Cập nhật: Nếu bạn có thể sử dụng mô hình diễn viên sau đó AKKA TCP IO sẽ tốt hơn.

+3

Tương lai không đúng sự thật. Đó là chủ đề/semaphore dựa trên: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html – Josmar

+9

"async thật" là gì? - Chỉ vì nó được thực hiện bằng cách sử dụng chủ đề không có nghĩa là nó không phải là không đồng bộ ... – DejanLekic

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