Pengenalan Ringkas kepada Java Thread.yield ()

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka kaedah hasil () di kelas Thread .

Kami akan membandingkannya dengan simpulan bahasa lain yang terdapat di Java dan akhirnya meneroka aplikasi praktikalnya.

2. Sinopsis hasil ()

Seperti yang dicadangkan oleh dokumentasi rasmi, hasil () menyediakan mekanisme untuk memberitahu "penjadual" bahawa utas semasa bersedia melepaskan penggunaan pemprosesnya sekarang tetapi ingin dijadualkan kembali secepat mungkin.

"Penjadual" bebas mematuhi atau mengabaikan maklumat ini dan sebenarnya, mempunyai tingkah laku yang berbeza-beza bergantung pada sistem operasi.

Fragmen kod berikut memaparkan dua utas dengan keutamaan yang sama setelah setiap jadual:

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(); } }

Apabila kita cuba menjalankan program di atas berkali-kali, kita mendapat hasil yang berbeza; sebahagian daripadanya disebutkan di bawah:

Lari 1:

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

Lari 2:

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

Oleh itu, seperti yang anda lihat, tingkah laku hasil () tidak bersifat deterministik dan juga bergantung pada platform.

3. Membandingkan dengan Idiom Lain

Terdapat konstruk lain untuk mempengaruhi perkembangan benang relatif. Mereka termasuk menunggu () , memberitahu () dan memberitahu semua () sebagai bahagian kelas Objek , bergabung () sebagai sebahagian daripada kelas Thread , dan tidur () sebagai sebahagian daripada kelas Thread .

Mari lihat bagaimana perbandingannya dengan hasil () .

3.1. hasil () vs tunggu ()

  • Walaupun hasil () dipanggil dalam konteks utas semasa, tunggu () hanya dapat dipanggil pada kunci yang diperoleh secara eksplisit di dalam blok atau kaedah yang diselaraskan
  • Tidak seperti hasil () , mungkin untuk menunggu () untuk menentukan jangka masa minimum untuk menunggu sebelum percubaan menjadualkan utas lagi
  • Dengan penantian () juga memungkinkan untuk membangunkan benang kapan saja melalui permintaan notifikasi () atau notifyAll () pada objek kunci yang berkenaan

3.2. hasil () vs tidur ()

  • Walaupun hasil () hanya dapat membuat upaya heuristik untuk menangguhkan pelaksanaan utas saat ini tanpa jaminan kapan ia akan dijadwalkan kembali, tidur () dapat memaksa penjadual untuk menangguhkan pelaksanaan utas saat ini untuk setidaknya waktu yang disebutkan tempoh sebagai parameternya.

3.3. hasil () vs gabung ()

  • Thread semasa boleh memanggil join () pada thread lain yang membuat thread semasa menunggu thread lain mati sebelum meneruskan
  • Secara pilihan, ia dapat menyebut jangka waktu sebagai parameternya yang menunjukkan waktu maksimum yang perlu ditunggu oleh utas semasa sebelum disambung semula

4. Penggunaan untuk hasil ()

Seperti yang dinyatakan oleh dokumentasi rasmi, jarang sekali perlu menggunakan hasil () dan oleh itu harus dielakkan kecuali sangat jelas dengan objektif berdasarkan tingkah lakunya.

Walaupun begitu, beberapa penggunaan untuk hasil () termasuk merancang konstruk kendali konkrit, meningkatkan daya tindak sistem dalam program komputasi berat dll.

Walau bagaimanapun, penggunaan ini mesti disertakan dengan profil dan penanda aras terperinci untuk memastikan hasil yang diinginkan.

5. Kesimpulan

Dalam artikel ringkas ini, kami membincangkan kaedah hasil () di kelas Thread dan melihat tingkah laku dan batasannya melalui fragmen kod.

Kami juga mengkaji perbandingannya dengan idiom konkurensi lain yang terdapat di Java dan akhirnya melihat beberapa kes penggunaan di mana hasil () mungkin berguna.

Seperti biasa, anda boleh melihat contoh yang diberikan dalam artikel ini di GitHub.