Tuesday, September 07, 2004

Java New I/O API


Java 2 Standard Edition 1.4 memiliki feature baru yaitu New I/O API (package java.nio) yang memberikan kemampuan performasi yang tinggi dan scalable untuk operasi input/output (baca tulis) files dan sockets, regular expressions, decoding/encoding character sets, in-memory mapping, dan locking file.

New I/O api menambahkan SocketAddress dan InetSocketAddress di package java.net, interface java.lang.CharSequence dan 6 package baru yaitu:

java.nio,
java.nio.channels,
java.nio.charset,
java.nio.channels.spi,
java.nio.charset.spi,
java.util.regex

"spi" singkatan dari "service-provider interface.

Jika kita membutuhkan high performance network I/O seperti router/server yang harus menerima koneksi bersamaan yang banyak, maka kita dapat menggunakan fasilitas API tersebut. New I/O juga sering disebut Non-blocking I/O karena kemampuannya dalam menangani koneksi yang banyak tanpa terjadi blocking I/O.

Cara yang biasa untuk mengangani koneksi I/O bersamaan adalah dengan meng-hanlde tiap koneksi oleh thead tersendiri. Hal ini dapat mengakibatkan banyaknya thread yang menghabiskan resource, menimbulkan kompleksitas singkronisasi antar thread hingga menimbulkannya deadlock.

Prinsip kerja New I/O ini adalah multiplexing dari koneksi I/O yang bersamaan. Beberapa koneksi yang direpresentasikan oleh SocketChannel di-handle oleh sebuah Selector, selector akan melakukan mekanisme baca/tulis dari tiap channel secara serial (multiplexing) dengan cara menggambil buffer. Tiap buffer yang diambil Selector yang merupakan bagian dari bagian data yang dikirim oleh client disebut key atau SelectionKey. Key tersebut kemudian dikirim ke pemroses atau server.

Algotitma non-blocking server adalah sebagai berikut:

create SocketChannel;
create Selector
associate the SocketChannel to the Selector
for(;;) {
waiting events from the Selector;
event arrived; create keys;
for each key created by Selector {
check the type of request;
isAcceptable:
get the client SocketChannel;
associate that SocketChannel to the Selector;
record it for read/write operations
continue;
isReadable:
get the client SocketChannel;
read from the socket;
continue;
isWriteable:
get the client SocketChannel;
write on the socket;
continue;
}
}
Untuk lebih detailnya, baca saja artikel-artikel berikut:

No comments:

Followers