Sebagai backend engineer, kami menghadapi situasi untuk memproses data secara asinkron. Hari ini mari kita lihat bagaimana hal itu dilakukan di java dan berbagai cara untuk melakukannya.

Thread

Komponen konkurensi Java yang sangat mendasar namun sangat kuat adalah Thread. Utas Java sebenarnya terkait dengan Utas Sistem Operasi. Cara paling dasar untuk membuat Thread adalah dengan memperluas dan menimpa run :

Memulai utas menyebabkan run() disebut.
Anda mungkin bertanya; ya, Thread memiliki banyak metode lain yang dapat diganti:

  • Dalam kebanyakan kasus, kami tidak ingin mengganti metode utas lainnya.
  • Setelah kami memperpanjang Thread kelas, kelas yang diperluas kehilangan kemampuannya untuk memperluas lebih jauh karena Java tidak mendukung banyak pewarisan.
  • Setiap utas memiliki objeknya sendiri ketika kami memperpanjangnya, dan itu tidak baik untuk kesehatan memori ketika ada banyak Objects of the extended Thread dibuat.

Java mengatasi masalah ini dengan antarmuka Runnable. Faktanya, Thread memiliki metode kelebihan beban yang menggunakan Runnable.

Runnable

Runnable adalah antarmuka yang hanya memiliki satu metode: run(). Ya, Runnable adalah antarmuka fungsional, dan instance-nya dapat dibuat dengan fungsi lambda. Namun ini adalah cara mudah untuk melakukan ini; untuk hal-hal yang kompleks, kami mungkin ingin menerapkannya. Lihat perbedaannya di sini. Ini semua tentang persyaratan:

Meskipun Runnable memiliki run(), ini bukan Thread tetapi hanya kelas Java sampai diambil kendali oleh (diteruskan ke) Thread. Awal utas menyebabkan objek yang dapat dijalankan run() disebut.

Ya, Java menyelesaikannya di versi 1.5, dan itu Callable.

Callable<V>

Callable adalah antarmuka umum. Mengapa? Jalankan perintah ini dari nilai kembalian sebagai generik menjalankan perintah ini. Callable juga merupakan antarmuka yang fungsional dan call() adalah satu-satunya metode, metode tanpa argumen yang melempar Pengecualian dan mengembalikan nilai perintah menjalankan generik ini.

Callable yang mengimplementasikan sangat mirip dengan Runnable:

Lihat di sini, panggilan memproses data dan mengembalikan nilai yang dapat dikumpulkan setelah eksekusi. Tetapi apakah ada perbedaan besar dalam menerapkannya? Kita gunakan ExecutorService untuk memanggil dan Future untuk menahan hasilnya. Mari kita bicara tentang mengapa.

Seperti yang Anda lihat, tidak ada perilaku terkontrol untuk membuat dan menjalankan Thread (Runnable atau Callable juga). Kami mungkin ingin mengontrol jumlah utas yang berjalan pada satu waktu karena masing-masing utas terkait dengan utas OS. Jumlah Thread yang kita jalankan harus lebih sedikit dari jumlah core CPU yang tersedia. Secara keseluruhan, Java menyelesaikannya dengan ExecutorService antarmuka.
Di atas adalah artikel informasi tentang Pemrograman Async di Java: Bagian I.
Jangan ragu untuk menghubungi kami melalui bagian komentar, jika Anda memiliki pertanyaan tentang instruksi yang kami bagikan di atas.