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?
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.
- 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.
- 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.
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.
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.
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.
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:
Spójrz tam jest łatwy w użyciu i bardzo potężny.
Do pierwotnego pytania, implementacja zużywa tylko wątek na operację wejścia / wyjścia w jednym przypadku, AsynchronousFileChannel w systemach Unix/Linux.
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