Asynchroniczne IO w Javie?

Jakie opcje dla async io (oparte na gniazdach) są w Javie inne niż java.nio? Również java.nio używa wątków w backround (tak jak myślę. NET async-Socket-library robi, może to zostało zmienione) czy jest to "prawdziwe" async io przy użyciu właściwego połączenia select?

Author: thr, 2009-02-26

6 answers

Pakiet

Java ' S NIO (od Java6), zapewnia wsparcie tylko dla nieblokujących we/wy , poprzez Selektor s. java7 ma nadzieję, że zostanie dostarczony z NIO.2, który obejmuje asynchroniczne wsparcie we / wy. Dzisiaj najlepiej jest skorzystać z frameworka. Rozejm wspomniał o minie. Oto kilka innych.

  1. Grizzly . Jest to rdzeń I/o dla serwera Sun GlassFish. Grizzly zapewnia możliwość asynchronicznego odczytu/zapisu (poprzez model kolejki). Informatyka obsługuje zarówno TCP, jak i UDP. Wykorzystałem Grizzly ' ego w kilku projektach. Są rzeczy, które lubię i nie lubię w ramach, ale szczegółowo jest to naprawdę inny temat. Powiem, że dość łatwo jest coś uruchomić i uruchomić, a Grizzly robi za Ciebie wiele ciężkich rzeczy.
  2. Netty . Projekt ten pochodzi od jednego z oryginalnych autorów projektu Mina. Nie używałem tego więc nie wiem o jego wsparciu dla asynchronicznych I / O. powinieneś spójrz.

Teraz, jeśli chodzi o twoje pytanie dotyczące wątków, selektory NIO nie używają wątków do nieblokowania We/Wy. w JDK6 używają select () pod Windows i funkcji epoll na nowszych jądrach Linuksa. W przypadku asynchronicznych We/Wy szczegóły wątku zależą od struktury.

 44
Author: JLR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-03 16:36:17

Pojawiła się JAVA 7, więc nową odpowiedzią jest NIO.2 z przyszłą klasą. Przykład:

Po stronie serwera:

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) (...)

Po stronie klienta:

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

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

Aktualizacja: Jeśli możesz użyć modelu actor to Akka TCP IO byłoby jeszcze lepiej.

 16
Author: Waldemar Wosiński,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 18:45:31

Kolejną sugestią w odniesieniu do libs byłoby Naga (http://naga.googlecode.com ). jest to trochę mniej jak framework, a bardziej jak biblioteka. Stara się wyglądać bardziej jak zwykłe gniazda java, jeśli to jest twoja filiżanka herbaty. Jest minimalistyczny w porównaniu do Grizzly, Mina i Netty.

 15
Author: Nuoji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-03 21:19:11

java.nio jest tylko pakietem-zbiorem "głupich" klas - sam w sobie nie wykorzystuje żadnego użycia wątków. W przypadku prawidłowego użycia, np. w Reactor design pattern , można uzyskać odpowiednie, w pełni skalowalne, asynchroniczne we/wy.

 12
Author: Yuval Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 20:33:54

Jeśli jesteś zainteresowany używaniem go do rzeczy sieciowych. Naprawdę dobry wybór to:

Http://mina.apache.org/

Spójrz tam jest łatwy w użyciu i bardzo potężny.

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-26 20:51:09

Do pierwotnego pytania, implementacja zużywa tylko wątek na operację wejścia / wyjścia w jednym przypadku, AsynchronousFileChannel w systemach Unix/Linux.

 2
Author: Alan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 14:14:12