Terkadang hang utas bermanfaat. Misalnya, utas terpisah dapat digunakan untuk menampilkan waktu hari itu. Jika pengguna tidak ingin menggunakan jam, utas ditangguhkan. Bagaimanapun, menangguhkan utas sangat sederhana, dan setelah ditangguhkan, memulai kembali utas juga merupakan masalah sederhana.
Mekanisme untuk menangguhkan, mengakhiri dan memulihkan benang berbeda dalam Java 2 dan versi sebelumnya. Meskipun Anda menggunakan Java 2 untuk menulis kode, Anda masih perlu memahami bagaimana operasi ini dilakukan di lingkungan Java awal. Misalnya, Anda mungkin perlu memperbarui atau memelihara kode lama. Anda juga perlu memahami mengapa Java 2 memiliki perubahan seperti itu. Untuk alasan ini, berikut ini menjelaskan metode asli mengeksekusi kontrol utas, diikuti oleh metode Java 2.
Jeda, pemulihan, dan penghentian utas di java 1.1 atau lebih awal
Sebelum versi Java2, program ini menggunakan suspend () dan resume () yang ditentukan utas untuk menjeda dan memulai kembali utas. Mereka dalam bentuk:
final void suspend () final void resume ()
Prosedur berikut menjelaskan metode ini:
// Suspend () dan resume (). Kelas Newthread Runnable {String Name; out .println ("utas baru:" + t); i> 0; ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::; NewThread ("One"); .sleep (1000); Sleep (1000); Tunggu utas untuk menyelesaikan {System.out.println ("Menunggu utas untuk menyelesaikannya.") println (utas utama terputus "); Bagian dari output program adalah sebagai berikut:
Thread Baru: Thread [One, 5, Main] Satu: 15 Benang Besar: Thread [Dua, 5, Utama] Dua: 15One: 14Two: 14One: 13Two: 13One: 12Two: 11Two: 11Suspending Thread onetwo: 10two: 9two: 8two: 7two: 6Resuming Thread OneSuspending Thread Twoone: 10One: 9One: 8one: 7One: 6Resuming Thread Twowaiting untuk utas untuk selesai. Dua: 5One: 5TWO: 4One: 4TWO: 3One: 3 Two: 2One: 2two: 1One: 1two exiting . Benang Main Keluar.
Kelas utas juga mendefinisikan stop () untuk mengakhiri utas. Bentuknya adalah sebagai berikut:
void stop ()
Setelah utas diakhiri, tidak dapat dilanjutkan dengan resume () untuk terus berjalan.
Menangguhkan, memulihkan, dan mengakhiri utas di Java
Metode Suspend (), Resume () dan Stop () yang ditentukan tampaknya merupakan cara yang sempurna dan nyaman untuk mengelola utas, dan mereka tidak dapat digunakan dalam versi program Java baru. Inilah alasannya. Metode suspend () dari kelas utas tidak disukai di Java2, karena suspend () terkadang dapat menyebabkan kegagalan sistem yang serius. Dengan asumsi bahwa utas untuk struktur data penting dikunci, jika utas ditangguhkan di sana, utas yang terkunci tidak melepaskan kendali sumber daya. Utas lain yang menunggu sumber daya ini mungkin menemui jalan buntu.
Metode resume () juga tidak disetujui. Itu tidak menyebabkan masalah, tetapi tidak dapat digunakan secara mandiri tanpa metode suspend (). Metode stop () dari kelas utas juga ditentang di Java 2. Ini karena metode ini dapat menyebabkan kegagalan sistem yang serius. Bayangkan sebuah utas menulis struktur data yang tepat dan penting dan hanya menyelesaikan satu fraksi. Jika utas berakhir pada saat ini, struktur data dapat tetap dalam keadaan crash.
Karena dalam metode Java 2, Suspend (), resume () dan stop () tidak dapat digunakan untuk mengontrol utas, Anda mungkin berpikir bahwa tidak ada cara untuk menghentikan, memulihkan dan mengakhiri utas. Sebenarnya, bukan itu masalahnya. Sebaliknya, utas harus dirancang sehingga metode run () secara berkala memeriksa untuk menentukan apakah utas harus ditangguhkan, melanjutkan atau menghentikan eksekusi sendiri. Secara perwakilan, ini dilakukan dengan menetapkan variabel bendera yang menunjukkan keadaan utas. Selama bendera diatur ke "berjalan", metode run () harus terus dieksekusi oleh utas. Jika bendera "ditangguhkan", utas harus dijeda. Jika diatur ke "Stop", utas harus diakhiri.
Tentu saja, ada banyak cara untuk menulis kode seperti itu, tetapi topik sentral harus sama untuk semua program.
Contoh -contoh berikut menggambarkan bagaimana metode tunggu () dan notify () diwarisi dari kontrol objek eksekusi utas. Contoh ini sangat mirip dengan program yang disebutkan sebelumnya. Namun, tidak ada metode yang tidak disetujui yang berguna. Mari kita pikirkan tentang pelaksanaan program.
Kelas NewTread berisi variabel instance SuspendFlag yang digunakan untuk mengontrol eksekusi utas. Ini diinisialisasi menjadi false oleh konstruktor. Metode run () berisi blok yang memantau deklarasi sinkronisasi SuspendFlag. Jika variabelnya benar, metode tunggu () dipanggil untuk menangguhkan utas. Metode mysuspend () menetapkan suspendflag ke true. Metode MyResume () menetapkan SuspendFlag ke False dan memanggil metode notify () untuk membangkitkan utas. Akhirnya, metode utama () dimodifikasi untuk memanggil metode mysuspend () dan myresume ().
// Menangguhkan dan memulihkan utas untuk Java2Class Newthread mengimplementasikan Runnable {String Name; out .println ("utas baru:" + t); t = 15; }}} Catch (InterruptedException E) {System.out.println (Nama + "Interrupted."); void myResume () {suspendFlag = false; coba {thread.sleep (1000); utas satu "); ob2.mysuspend (); System.out.println (" Suspening Thread Two "); thread.sleep (1000); ob2.myresume (); System.out.println (" Resume Thread t wo ") ; t.join (); }Output dari program ini sama dengan program sebelumnya. Kemudian di buku ini, Anda akan melihat lebih banyak contoh menggunakan mekanisme Java 2 untuk mengontrol utas. Meskipun mekanisme ini tidak "bersih" seperti metode lama, itu adalah cara untuk memastikan bahwa tidak ada kesalahan yang terjadi saat runtime. Ini adalah metode yang harus diambil semua kode baru.