Model Threading di Jawa

1. Pengenalan

Selalunya dalam aplikasi kita, kita mesti dapat melakukan banyak perkara pada masa yang sama. Kita dapat mencapainya dengan beberapa cara, tetapi yang penting di antaranya adalah melaksanakan multitasking dalam beberapa bentuk.

Multi-tasking bermaksud menjalankan beberapa tugas pada masa yang sama , di mana setiap tugas menjalankan tugasnya. Tugas-tugas ini biasanya dijalankan pada masa yang sama, membaca dan menulis memori yang sama dan berinteraksi dengan sumber yang sama, tetapi melakukan perkara yang berbeza.

2. Benang Asli

Cara standard melaksanakan multi-tasking di Java adalah menggunakan utas . Threading biasanya disokong ke sistem operasi. Kami memanggil utas yang berfungsi pada tahap ini sebagai "utas asli".

Sistem operasi mempunyai beberapa kemampuan dengan threading yang sering tidak tersedia untuk aplikasi kami, hanya kerana seberapa dekatnya dengan perkakasan yang mendasari. Ini bermaksud bahawa menjalankan benang asli biasanya lebih cekap. Benang ini secara langsung memetakan ke utas pelaksanaan pada CPU komputer - dan sistem operasi mengurus pemetaan utas ke inti CPU.

Model utas standard di Java, merangkumi semua bahasa JVM, menggunakan utas asli . Ini telah berlaku sejak Java 1.2 dan berlaku tanpa mengira sistem asas yang dijalankan oleh JVM.

Ini bermaksud bahawa bila-bila masa kita menggunakan mana-mana mekanisme utas standard di Java, maka kita menggunakan utas asli. Ini termasuk java.lang.Thread , java.util.concurrent.Executor , java.util.concurrent.ExecutorService , dan sebagainya.

3. Benang Hijau

Dalam kejuruteraan perisian, satu alternatif untuk benang asli adalah benang hijau . Di sinilah kita menggunakan utas, tetapi mereka tidak memetakan secara langsung ke utas sistem operasi. Sebaliknya, seni bina yang mendasari menguruskan benang itu sendiri dan menguruskan bagaimana peta ini ke rangkaian sistem operasi.

Biasanya ini berfungsi dengan menjalankan beberapa utas asli dan kemudian mengalihkan benang hijau ke utas asli ini untuk pelaksanaan . Sistem kemudian boleh memilih benang hijau mana yang aktif pada waktu tertentu, dan benang asli yang aktif.

Ini terdengar sangat rumit, dan memang begitu. Tetapi ini adalah komplikasi yang kita tidak perlu ambil peduli. Seni bina yang mendasari mengurus semua ini, dan kita dapat menggunakannya seolah-olah itu adalah model threading asli.

Jadi mengapa kita melakukan ini? Benang asli sangat berkesan untuk dijalankan, tetapi kosnya tinggi untuk memulakan dan menghentikannya. Benang hijau membantu mengelakkan kos ini dan memberi lebih banyak fleksibiliti kepada seni bina. Sekiranya kita menggunakan utas yang agak lama, maka benang asli sangat berkesan. Untuk pekerjaan yang sangat pendek, kos untuk memulakannya melebihi faedah menggunakannya . Dalam kes ini, benang hijau boleh menjadi lebih cekap.

Malangnya, Java tidak mempunyai sokongan terpasang untuk benang hijau.

Versi yang sangat awal menggunakan benang hijau dan bukan benang asli sebagai model utas standard. Ini berubah di Java 1.2, dan sejak itu belum ada dukungan untuk itu di tingkat JVM.

Juga sukar untuk menerapkan benang hijau di perpustakaan kerana mereka memerlukan sokongan tahap rendah untuk berprestasi dengan baik. Oleh itu, alternatif yang biasa digunakan ialah serat.

4. gentian

Serat adalah bentuk alternatif multi-utas dan serupa dengan benang hijau . Dalam kedua kes tersebut, kami tidak menggunakan utas asli dan sebaliknya menggunakan kawalan sistem yang mendasari yang berjalan setiap saat. Perbezaan besar antara benang hijau dan serat adalah pada tahap kawalan, dan khususnya siapa yang mengendalikan.

Benang hijau adalah bentuk multitasking pilihan. Ini bermaksud bahawa seni bina yang mendasari sepenuhnya bertanggungjawab untuk menentukan utas mana yang dilaksanakan pada waktu tertentu.

Ini bermaksud bahawa semua masalah threading biasa berlaku, di mana kita tidak mengetahui apa-apa mengenai urutan utas kita dilaksanakan, atau yang mana yang akan dilaksanakan pada masa yang sama. Ini juga bermaksud bahawa sistem yang mendasari perlu dapat menjeda dan memulakan semula kod kita pada bila-bila masa, berpotensi di tengah kaedah atau bahkan pernyataan.

Serat bukan merupakan bentuk multitasking koperasi, yang bermaksud bahawa benang yang berjalan akan terus berjalan sehingga memberi isyarat bahawa ia dapat menghasilkan yang lain . Ini bermaksud bahawa adalah tanggungjawab kita untuk serat untuk bekerjasama antara satu sama lain. Ini memberi kita kawalan langsung apabila serat dapat menghentikan pelaksanaan, dan bukannya sistem yang menentukan ini untuk kita.

Ini juga bermaksud kita perlu menulis kod kita dengan cara yang memungkinkan. Jika tidak, ia tidak akan berjaya. Sekiranya kod kami tidak mempunyai titik gangguan, maka kami juga sama sekali tidak menggunakan serat.

Java tidak mempunyai sokongan terbina dalam untuk serat. Terdapat beberapa perpustakaan yang dapat memperkenalkan ini ke aplikasi kami, termasuk tetapi tidak terhad kepada:

4.1. Quasar

Quasar adalah perpustakaan Java yang berfungsi dengan baik dengan Java dan Kotlin murni dan mempunyai versi alternatif yang berfungsi dengan Clojure.

Ia berfungsi dengan mempunyai ejen Java yang perlu dijalankan bersama aplikasi, dan ejen ini bertanggungjawab untuk menguruskan gentian dan memastikannya berfungsi dengan betul. Penggunaan ejen Java bermaksud bahawa tidak ada langkah-langkah khas yang diperlukan.

Quasar juga memerlukan Java 11 untuk berfungsi dengan betul sehingga mungkin membatasi aplikasi yang dapat menggunakannya. Versi lama boleh digunakan di Java 8, tetapi versi ini tidak disokong secara aktif.

4.2. Kilim

Kilim adalah perpustakaan Java yang menawarkan fungsi yang sangat serupa dengan Quasar tetapi melakukannya dengan menggunakan tenunan bytecode dan bukannya ejen Java . Ini bermakna ia boleh berfungsi di lebih banyak tempat, tetapi menjadikan proses pembinaan lebih rumit.

Kilim berfungsi dengan Java 7 dan yang lebih baru dan akan berfungsi dengan betul walaupun dalam senario di mana ejen Java bukan pilihan. Sebagai contoh, jika yang lain sudah digunakan untuk instrumentasi atau pemantauan.

4.3. Loom Projek

Project Loom adalah percubaan oleh projek OpenJDK untuk menambahkan gentian ke JVM itu sendiri, dan bukan sebagai perpustakaan tambahan . Ini akan memberi kita kelebihan serat daripada benang. Dengan menerapkannya secara langsung di JVM, dapat membantu menghindari komplikasi yang diperkenalkan oleh agen Java dan tenunan bytecode.

Tidak ada jadual pelepasan semasa untuk Project Loom, tetapi kami boleh memuat turun binari akses awal sekarang untuk melihat bagaimana keadaannya. Namun, kerana masih sangat awal, kita harus berhati-hati bergantung pada ini untuk setiap kod pengeluaran.

5. Rutin Bersama

Rutin bersama adalah alternatif untuk menggunakan benang dan serat. Kita boleh menganggap rutin bersama sebagai gentian tanpa sebarang bentuk penjadualan . Daripada sistem yang mendasari menentukan tugas yang dilakukan pada bila-bila masa, kod kami melakukan ini secara langsung.

Secara amnya, kami menulis rutin bersama sehingga menghasilkan pada titik aliran tertentu. Ini dapat dilihat sebagai titik berhenti dalam fungsi kita, di mana ia akan berhenti berfungsi dan berpotensi menghasilkan beberapa hasil pertengahan. Apabila kita menghasilkan, kita kemudian dihentikan sehingga kod panggilan memutuskan untuk memulakan semula kita dengan alasan apa pun. Ini bermaksud bahawa kod panggilan kami mengawal penjadualan kapan ini akan dijalankan.

Kotlin mempunyai sokongan asli untuk rutin bersama yang terdapat di perpustakaan standardnya. Terdapat beberapa perpustakaan Java lain yang dapat kita gunakan untuk menerapkannya juga jika dikehendaki.

6. Kesimpulannya

Kami telah melihat beberapa alternatif untuk multi-tasking dalam kod kami, mulai dari benang asli tradisional hingga beberapa alternatif yang sangat ringan. Mengapa tidak mencubanya pada waktu aplikasi memerlukan serentak?