Konsep Java Threading <BR /> Tidak seperti kebanyakan bahasa komputer lainnya, Java mendukung pemrograman multithreaded di built-in.
Program multi-threaded berisi dua atau lebih bagian yang berjalan secara bersamaan. Setiap bagian dalam program ini disebut utas, dan setiap utas memiliki jalur eksekusi independen. Oleh karena itu, multithreading adalah bentuk khusus dari multitasking.
Anda harus tahu multitasking karena sebenarnya didukung oleh semua sistem operasi modern. Namun, ada dua jenis multitasking yang berbeda: berbasis proses dan berbasis utas. Sangat penting untuk memahami perbedaan antara keduanya.
Bagi banyak pembaca, multitasking berbasis proses adalah bentuk yang lebih akrab. Suatu proses pada dasarnya adalah program pelaksanaan. Oleh karena itu, multitasking berbasis proses ditandai dengan memungkinkan komputer Anda menjalankan dua atau lebih program secara bersamaan. Misalnya, multitasking berbasis proses memungkinkan Anda menjalankan kompiler Java secara bersamaan saat menggunakan editor teks. Dalam multitasking berbasis proses, suatu program adalah unit kode terkecil yang ditetapkan oleh penjadwal.
Dalam lingkungan multitasking berbasis utas, utas adalah unit eksekusi terkecil. Ini berarti bahwa suatu program dapat melakukan fungsi dua atau lebih tugas secara bersamaan. Misalnya, editor teks dapat memformat teks saat mencetak. Oleh karena itu, program multi-proses menangani "gambar besar", sementara program multi-threaded menangani detail.
Program multithreaded membutuhkan lebih sedikit biaya administrasi daripada program multi-proses. Proses adalah tugas kelas berat yang membutuhkan ruang alamat independen mereka sendiri. Komunikasi antar proses mahal dan dibatasi. Transformasi antar proses juga sangat mahal. Thread, di sisi lain, adalah pemain yang ringan. Mereka berbagi ruang alamat yang sama dan berbagi proses yang sama bersama -sama. Komunikasi antar-thread murah, dan konversi antar-thread juga berbiaya rendah. Ketika program Java menggunakan lingkungan pemrosesan tugas multi-proses, program multi-proses tidak dikendalikan oleh Java, sementara multi-threading dikendalikan oleh Java.
Multithreading membantu Anda menulis program yang efisien dengan pemanfaatan CPU maksimum, karena waktu idle dijaga seminimal mungkin. Ini sangat penting untuk lingkungan interkoneksi jaringan interaktif yang berjalan di Java, karena waktu luang adalah publik. Misalnya, laju transmisi data jaringan jauh lebih rendah dari kapasitas pemrosesan komputer, dan kecepatan bacaan dan penulisan sumber daya sistem file lokal jauh lebih rendah daripada CPU. . Dalam lingkungan satu threaded tradisional, program Anda harus menunggu setiap tugas tersebut diselesaikan sebelum melakukan langkah berikutnya-meskipun CPU memiliki banyak waktu luang. Multithreading memungkinkan Anda untuk mendapatkan dan memanfaatkan waktu luang ini.
Model Threading Java
Sistem runtime Java bergantung pada utas dalam banyak hal, dan semua desain perpustakaan kelas memperhitungkan multithreading. Bahkan, Java menggunakan utas untuk membuat seluruh lingkungan tidak sinkron. Ini membantu mengurangi bagian yang tidak valid dengan mencegah limbah loop CPU.
Untuk lebih memahami keuntungan dari lingkungan multithreaded, itu dapat dibandingkan dengan kontrolnya. Metode pemrosesan sistem satu threaded adalah menggunakan metode loop peristiwa yang disebut jajak pendapat. Dalam model ini, kontrol tunggal berlari berjalan dalam loop tak terbatas, polling urutan peristiwa untuk menentukan apa yang harus dilakukan selanjutnya. Setelah perangkat pemungutan suara mengembalikan sinyal bahwa file jaringan siap dibaca, kontrol penjadwalan loop acara mengelola penangan acara yang sesuai. Sampai event handler kembali, tidak ada peristiwa lain yang terjadi dalam sistem. Ini membuang waktu CPU. Ini menyebabkan bagian dari program untuk menempati sistem secara eksklusif dan mencegah pelaksanaan peristiwa lain. Secara umum, dalam lingkungan satu utas, ketika sebuah thread blok (blok, menangguhkan eksekusi) sambil menunggu sumber daya, seluruh program berhenti berjalan.
Keuntungan dari java multithreading adalah bahwa ia membatalkan mekanisme loop/pemungutan suara utama. Benang dapat dijeda tanpa mempengaruhi bagian lain dari program ini. Misalnya, waktu idle yang dihasilkan ketika utas membaca data dari jaringan atau menunggu input pengguna dapat digunakan di tempat lain. Multithreading memungkinkan loop hidup untuk tidur selama satu detik di setiap celah bingkai tanpa menghentikan seluruh sistem. Ada penyumbatan utas dalam program Java, hanya satu utas yang ditangguhkan, dan utas lainnya terus berjalan.
Thread ada di beberapa negara bagian. Utas bisa berjalan. Ini bisa berjalan selama Anda mendapatkan waktu CPU. Benang yang berjalan dapat ditangguhkan dan sementara mengganggu eksekusi. Benang yang ditangguhkan dapat dilanjutkan, memungkinkannya untuk terus berjalan dari tempat berhenti.
Kapan saja, utas dapat berakhir, yang segera mengganggu operasinya. Setelah diakhiri, utas tidak dapat dipulihkan.
Prioritas utas
Java memprioritaskan setiap utas untuk menentukan cara merawat utas jika dibandingkan dengan utas lainnya. Prioritas utas adalah bilangan bulat yang merinci hubungan prioritas antara utas. Sebagai nilai absolut, prioritas tidak ada artinya; ketika hanya ada satu utas, utas dengan prioritas tinggi tidak berjalan lebih cepat dari utas dengan prioritas rendah. Sebagai gantinya, prioritas utas digunakan untuk menentukan kapan harus beralih dari satu utas ke yang lain. Ini disebut "sakelar konteks". Aturan yang menentukan terjadinya konversi konteks sederhana:
Thread dapat secara otomatis melepaskan kontrol. Dalam kasus I/O ragu -ragu, tidur atau pemblokiran dilakukan dengan konsesi eksplisit. Di bawah asumsi ini, semua utas lainnya terdeteksi dan utas prioritas tertinggi yang siap dijalankan diberikan kepada CPU.
Utas dapat didahului oleh utas prioritas tinggi. Dalam hal ini, utas prioritas rendah tidak menyerah secara aktif, prosesor hanya ditempati pertama - tidak peduli apa yang dilakukannya - prosesor ditempati oleh utas prioritas tinggi. Pada dasarnya, begitu utas prioritas tinggi akan berjalan, itu dijalankan. Ini disebut prioritas multitasking.
Situasinya sedikit rumit ketika dua utas dari prioritas yang sama bersaing untuk siklus CPU. Untuk sistem operasi seperti Windows 98, utas dengan prioritas yang sama secara otomatis membagi waktu dalam mode loop. Untuk sistem operasi lainnya, seperti Solaris 2.x, utas prioritas secara otomatis ditinggalkan relatif terhadap rekan -rekan mereka. Jika ini bukan masalahnya, utas lain tidak akan berjalan.
Peringatan: Konteks konversi utas prioritas yang lebih rendah pada sistem operasi yang berbeda dapat menghasilkan kesalahan.
Sinkronisasi
Karena multithreading memperkenalkan perilaku asinkron dalam program Anda, harus ada cara untuk meningkatkan sinkronisasi saat Anda membutuhkannya. Misalnya, jika Anda ingin dua utas berkomunikasi satu sama lain dan berbagi struktur data yang kompleks, seperti urutan daftar yang ditautkan, Anda perlu beberapa cara untuk memastikan mereka tidak saling bertentangan. Artinya, Anda harus mencegah satu utas dari menulis data sementara utas lain membaca data dari daftar tertaut. Untuk tujuan ini, Java mengimplementasikan metode lain berdasarkan model lama sinkronisasi antar proses: monitor. Proses manajemen adalah mekanisme kontrol yang pertama kali ditentukan oleh Carhoare.
Anda dapat menganggap proses manajemen sebagai kotak kecil yang hanya mengontrol satu utas. Setelah utas memasuki pipa, semua utas harus menunggu sampai utas keluar dari pipa. Dengan cara ini, manajemen dapat digunakan untuk mencegah sumber daya bersama dimanipulasi oleh banyak utas.
Banyak sistem multi-threaded menganggap proses manajemen sebagai objek yang harus dirujuk dan dioperasikan oleh program dengan jelas. Java memberikan solusi yang jelas. Tidak ada kelas "monitor"; Setelah utas termasuk dalam metode sinkronisasi, tidak ada utas lain yang dapat memanggil metode sinkronisasi dari objek yang sama. Ini memungkinkan Anda untuk menulis kode multi-threaded yang sangat jelas dan ringkas, karena dukungan sinkronisasi built-in untuk bahasa tersebut.
Pengiriman pesan
Setelah Anda membagi program menjadi beberapa utas, Anda perlu menentukan koneksi antara setiap utas. Saat perencanaan di sebagian besar bahasa lain, Anda harus mengandalkan sistem operasi untuk membangun komunikasi antar-utang. Ini pasti akan meningkatkan biaya. Namun, Java menyediakan cara yang bersih dan berbiaya rendah untuk berbicara di antara multithreads - dengan memanggil metode yang telah ditentukan sebelumnya yang dimiliki semua objek. Sistem pesan Java memungkinkan utas untuk memasukkan metode sinkron suatu objek dan kemudian menunggu di sana sampai utas lain secara eksplisit memberi tahu itu.
Kelas utas dan antarmuka runnable
Sistem multi-threaded Java didasarkan pada kelas utas, metodenya, dan antarmuka perusahaan rekannya yang dapat dijalankan. Kelas utas merangkum pelaksanaan utas. Karena Anda tidak dapat secara langsung merujuk ke keadaan utas yang sedang berjalan, Anda harus memprosesnya melalui proxy -nya, sehingga instance utas dihasilkan. Untuk membuat utas baru, program Anda harus memperluas utas atau mengimplementasikan antarmuka Runnable.
Kelas utas mendefinisikan beberapa metode untuk membantu mengelola utas. Metode yang digunakan dalam bab ini ditampilkan dalam tabel: