Hai! Sebagai pemasok NIO, saya telah mendalami dunia I/O asinkron Java NIO, dan hari ini saya bersemangat untuk berbagi dengan Anda cara menggunakan CompletionHandler di I/O asinkron Java NIO. Ini adalah konsep yang cukup keren yang benar-benar dapat meningkatkan permainan pemrograman Anda, terutama ketika berhadapan dengan operasi I/O berperforma tinggi.
Pertama, mari kita pahami apa itu I/O asinkron Java NIO. Dalam I/O Java tradisional, operasi diblokir. Artinya ketika Anda melakukan operasi I/O seperti membaca file atau mengambil data dari soket jaringan, program Anda harus menunggu hingga operasi tersebut selesai sebelum dapat melanjutkan ke tugas berikutnya. Ini bisa menjadi hambatan yang nyata, terutama pada aplikasi dengan lalu lintas tinggi di mana Anda tidak ingin program Anda terjebak menunggu.
I/O asinkron Java NIO, di sisi lain, memungkinkan program Anda untuk terus melakukan tugas lain saat operasi I/O sedang berlangsung. Ini menggunakan pendekatan berbasis panggilan balik atau berbasis masa depan untuk memberi tahu program Anda ketika operasi selesai. Dan di situlah CompletionHandler berperan.
CompletionHandler adalah antarmuka di Java NIO yang mendefinisikan dua metode:selesaiDangagal. ItuselesaiMetode ini dipanggil ketika operasi I/O asinkron selesai dengan sukses, dan metode ini memberi Anda akses ke hasil operasi. ItugagalMetode ini dipanggil jika terjadi kesalahan selama operasi, dan metode ini memberikan informasi tentang kesalahan tersebut.
Mari kita mulai dengan contoh sederhana penggunaan CompletionHandler untuk pembacaan file asinkron.
impor java.nio.ByteBuffer; impor java.nio.channels.AsynchronousFileChannel; impor java.nio.channels.CompletionHandler; impor java.nio.file.Path; impor java.nio.file.Paths; impor java.nio.file.StandardOpenOption; kelas publik AsyncFileReadExample { public static void main(String[] args) { Jalur jalur = Paths.get("test.txt"); coba (AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ)) { ByteBuffer buffer = ByteBuffer.allocation(1024); fileChannel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() { @Override public void selesai(Hasil bilangan bulat, lampiran ByteBuffer) { System.out.println("Baca " + hasil + " bytes"); buffer.flip(); byte[] data = byte baru[buffer.limit()]; buffer.get(data); System.out.println(String baru(data)); } @Override public void gagal(Exc yang dapat dilempar, lampiran ByteBuffer) { System.err.println("Bacaan gagal: " + exc.getMessage()); // Melakukan tugas lain saat operasi baca sedang berlangsung System.out.println("Melakukan tugas lain..."); Thread.tidur(2000); } catch (Pengecualian e) { e.printStackTrace(); } } }
Dalam contoh ini, pertama-tama kita membuka sebuahSaluran File Asinkronuntuk membaca. Kemudian kami mengalokasikan aByteBufferuntuk menyimpan data yang akan kita baca. Kami memanggilmembacametode pada saluran file, meneruskan buffer, posisi untuk mulai membaca (dalam hal ini, 0), lampiran (yang dapat berupa objek apa pun yang ingin Anda teruskan bersama dengan operasi), dan sebuah instance dari kamiPenyelesaianHandler.


Ituselesaimetode diPenyelesaianHandlerdipanggil ketika operasi baca berhasil. Ini mencetak jumlah byte yang dibaca, membalik buffer, dan kemudian mencetak konten buffer sebagai string. ItugagalMetode ini dipanggil jika ada kesalahan selama operasi baca, dan metode ini mencetak pesan kesalahan.
Saat operasi baca sedang berlangsung, program kita dapat terus melakukan tugas lainnya. Dalam contoh sederhana ini, kita hanya mencetak pesan dan kemudian tidur selama beberapa detik.
Sekarang, mari kita bahas tentang penggunaan CompletionHandler untuk I/O jaringan. Misalkan Anda sedang membangun aplikasi klien - server, dan Anda ingin menangani koneksi masuk secara asinkron.
impor java.io.IOException; impor java.net.InetSocketAddress; impor java.nio.ByteBuffer; impor java.nio.channels.AsynchronousServerSocketChannel; impor java.nio.channels.AsynchronousSocketChannel; impor java.nio.channels.CompletionHandler; kelas publik AsyncServerExample { public static void main(String[] args) { coba (AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open()) { serverSocketChannel.bind(new InetSocketAddress(8080)); System.out.println("Server dimulai pada port 8080"); serverSocketChannel.accept(null, CompletionHandler baru<AsynchronousSocketChannel, Void>() { @Override public void selesai(AsynchronousSocketChannel clientChannel, lampiran Void) { serverSocketChannel.accept(null, this); System.out.println("Klien baru terhubung"); ByteBuffer buffer = ByteBuffer.allocation(1024); clientChannel.read(buffer, buffer, baru CompletionHandler<Integer, ByteBuffer>() { @Override public void selesai(Hasil bilangan bulat, lampiran ByteBuffer) { if (hasil > 0) { attachment.flip(); byte[] data = byte baru[attachment.limit()]; clientChannel.write(ByteBuffer.wrap(("Anda mengirim: " + pesan).getBytes())).get(); } catch (Pengecualian e) { e.printStackTrace(); } coba { clientChannel.close(); } catch (IOException e) { e.printStackTrace(); System.err.println("Bacaan gagal: " + exc.getMessage()); coba { clientChannel.close(); } catch (IOException e) { e.printStackTrace(); // Biarkan server tetap berjalan Thread.sleep(Long.MAX_VALUE); } catch (Pengecualian e) { e.printStackTrace(); } } }
Dalam contoh server ini, kami membuka sebuahSaluran SoketServer Asinkrondan ikat ke port 8080. Lalu kita panggilmenerimametode pada saluran soket server, meneruskan aPenyelesaianHandler. Saat klien baru terhubung,selesaimetodePenyelesaianHandlerdisebut. Di dalam metode ini, kami menerima koneksi lain (sehingga server dapat menangani banyak klien), mencetak pesan yang menunjukkan klien baru telah terhubung, dan kemudian mulai membaca data dari klien.
Kami menggunakan yang lainPenyelesaianHandleruntuk operasi baca. Jika pembacaan berhasil, kami mencetak pesan yang diterima dan mengirimkan respons kembali ke klien. Jika ada kesalahan, kami mencetak pesan kesalahan dan menutup saluran klien.
Salah satu hal hebat tentang penggunaan CompletionHandler di I/O asinkron Java NIO adalah memungkinkan Anda menangani beberapa operasi I/O secara bersamaan tanpa memblokir program Anda. Hal ini dapat menghasilkan aplikasi yang jauh lebih efisien dan responsif, terutama dalam skenario ketika Anda memiliki klien dalam jumlah besar atau transfer data bervolume tinggi.
Jika Anda menyukai mobil listrik, Anda mungkin tertarik dengan mobil tersebutMobil Listrik Nio ET5. Ini adalah kendaraan listrik ramping dan berkinerja tinggi yang menggabungkan gaya dan teknologi, seperti bagaimana CompletionHandler menggabungkan efisiensi dan fleksibilitas dalam I/O asinkron Java NIO.
Sebagai pemasok NIO, saya tahu pentingnya sistem berkinerja tinggi dan andal. Baik itu di industri otomotif atau pemrograman perangkat lunak, kami selalu mencari cara untuk mengoptimalkan dan meningkatkannya. Jika Anda tertarik untuk mempelajari lebih lanjut tentang I/O asinkron Java NIO atau memiliki kebutuhan terkait produk dan layanan kami, jangan ragu untuk menghubungi kami. Kami di sini untuk membantu Anda membawa proyek Anda ke tingkat berikutnya. Mari kita ngobrol tentang bagaimana kita dapat bekerja sama untuk memenuhi kebutuhan Anda.
Referensi:
- Dokumentasi Java NIO
- Berbagai tutorial pemrograman online dan blog



























































