Pengantar Singkat tentang Java Thread.yield ()

1. Ikhtisar

Dalam tutorial ini, kita akan menjelajahi metode yield () di kelas Thread .

Kami akan membandingkannya dengan idiom konkurensi lain yang tersedia di Java dan pada akhirnya menjelajahi aplikasi praktisnya.

2. Sinopsis hasil ()

Seperti yang disarankan oleh dokumentasi resmi, yield () menyediakan mekanisme untuk menginformasikan "penjadwal" bahwa thread saat ini bersedia melepaskan penggunaan prosesornya saat ini, tetapi ingin dijadwalkan kembali secepatnya.

"Penjadwal" bebas untuk mematuhi atau mengabaikan informasi ini dan pada kenyataannya, memiliki perilaku yang berbeda-beda tergantung pada sistem operasi.

Fragmen kode berikut menampilkan dua utas dengan prioritas yang sama yang menghasilkan setelah setiap jadwal:

public class ThreadYield { public static void main(String[] args) { Runnable r = () -> { int counter = 0; while (counter < 2) { System.out.println(Thread.currentThread() .getName()); counter++; Thread.yield(); } }; new Thread(r).start(); new Thread(r).start(); } }

Ketika kami mencoba menjalankan program di atas beberapa kali, kami mendapatkan hasil yang berbeda; beberapa di antaranya disebutkan di bawah ini:

Jalankan 1:

Thread-0 Thread-1 Thread-1 Thread-0

Jalankan 2:

Thread-0 Thread-0 Thread-1 Thread-1

Jadi seperti yang Anda lihat, perilaku yield () tidak bersifat deterministik dan juga bergantung pada platform.

3. Membandingkan dengan Idiom Lain

Ada konstruksi lain untuk memengaruhi perkembangan relatif utas. Mereka termasuk wait () , notify () dan notifyAll () sebagai bagian dari kelas Object , join () sebagai bagian dari kelas Thread , dan sleep () sebagai bagian dari kelas Thread .

Mari kita lihat bagaimana perbandingannya dengan yield () .

3.1. hasil () vs menunggu ()

  • Sementara yield () dipanggil dalam konteks utas saat ini, wait () hanya dapat dipanggil pada kunci yang diperoleh secara eksplisit di dalam blok atau metode yang disinkronkan
  • Tidak seperti yield () , ada kemungkinan wait () menentukan periode waktu minimum untuk menunggu sebelum ada upaya untuk menjadwalkan thread lagi
  • Dengan wait () juga dimungkinkan untuk membangunkan utas kapan saja melalui pemanggilan notify () atau notifyAll () pada objek kunci yang bersangkutan

3.2. hasil () vs tidur ()

  • Meskipun yield () hanya dapat melakukan upaya heuristik untuk menangguhkan eksekusi thread saat ini tanpa jaminan kapan akan dijadwalkan kembali, sleep () dapat memaksa penjadwal untuk menangguhkan eksekusi thread saat ini setidaknya untuk waktu yang disebutkan periode sebagai parameternya.

3.3. hasil () vs bergabung ()

  • Utas saat ini dapat memanggil join () pada utas lain mana pun yang membuat utas saat ini menunggu utas lain mati sebelum melanjutkan
  • Secara opsional dapat menyebutkan periode waktu sebagai parameternya yang menunjukkan waktu maksimum yang harus ditunggu oleh utas saat ini sebelum melanjutkan

4. Penggunaan untuk hasil ()

Seperti yang disarankan oleh dokumentasi resmi, jarang diperlukan penggunaan yield () dan karenanya harus dihindari kecuali sangat jelas dengan tujuan terkait perilakunya.

Meskipun demikian, beberapa penggunaan untuk yield () termasuk merancang konstruksi kontrol konkurensi, meningkatkan daya tanggap sistem dalam program komputasi-berat, dll.

Namun, penggunaan ini harus disertai dengan pembuatan profil terperinci dan pembandingan untuk memastikan hasil yang diinginkan.

5. Kesimpulan

Dalam artikel singkat ini, kita membahas metode yield () di kelas Thread dan melihat perilaku serta batasannya melalui fragmen kode.

Kami juga mempelajari perbandingannya dengan idiom konkurensi lain yang tersedia di Java dan akhirnya melihat beberapa kasus penggunaan di mana yield () mungkin berguna.

Seperti biasa, Anda dapat melihat contoh yang diberikan dalam artikel ini di GitHub.