Ang

"Hi, Amigo!"

"Gusto kong sumisid nang malalim sa iyo tungkol sa wait-notify. Ang mga paraan ng wait-notify ay nagbibigay ng isang maginhawang mekanismo para sa mga thread na makipag-ugnayan. Magagamit din ang mga ito upang bumuo ng mga kumplikadong mekanismo sa mataas na antas para sa pakikipag-ugnayan ng thread."

"Magsisimula ako sa isang maliit na halimbawa. Ipagpalagay na mayroon kaming isang programa para sa isang server na dapat magsagawa ng iba't ibang mga gawain na ginawa ng mga gumagamit sa pamamagitan ng isang website. Ang mga gumagamit ay maaaring magdagdag ng iba't ibang mga gawain sa iba't ibang oras. Ang mga gawain ay masinsinang mapagkukunan, ngunit ang aming server ay 8 Kakayanin ng -core processor. Paano natin dapat gawin ang mga gawain sa server?"

"Una, gagawa kami ng isang pangkat ng mga thread ng manggagawa, kasing dami ng mga core ng processor. Ang bawat thread ay magagawang tumakbo sa sarili nitong core: Ang mga thread ay hindi makagambala sa isa't isa, at ang mga core ng processor ay hindi umupo ng walang ginagawa."

"Pangalawa, gagawa kami ng queue object kung saan idadagdag ang mga gawain ng mga user. Ang iba't ibang uri ng mga gawain ay tumutugma sa iba't ibang mga object, ngunit lahat ng mga ito ay magpapatupad ng Runnable na interface upang mapatakbo ang mga ito."

"Maaari mo ba akong bigyan ng isang halimbawa ng isang bagay na gawain?"

"Tingnan mo:"

Isang klase na nagkalkula ng n factorial kapag tinawag ang run() na pamamaraan
class Factorial implements Runnable
{
 public int n = 0;
 public long result = 1;

 public Factorial (int n)
 {
  this.n = n;
 }

 public void run()
 {
  for (int i = 2; i <= n; i++)
   result *= i;
 }
}

"So far, so good."

"Mahusay. Kung gayon, suriin natin kung ano ang hitsura ng isang bagay sa pila. Ano ang masasabi mo sa akin tungkol dito?"

"Ito ay dapat na thread-safe. Ito ay ni-load ng mga bagay sa gawain ng isang thread na tumatanggap ng mga ito mula sa mga user, at pagkatapos ay ang mga gawain ay kinuha ng mga thread ng manggagawa."

"Yep. At paano kung maubusan tayo ng mga gawain sandali?"

"Kung gayon ang mga thread ng manggagawa ay dapat maghintay hanggang magkaroon ng higit pa."

"Tama. Ngayon isipin na ang lahat ng ito ay mabubuo sa iisang pila. Tingnan ito:"

Isang pila ng gawain. Kung walang mga gawain, kung gayon ang thread ay natutulog at naghihintay para sa isa na lumitaw:
public class JobQueue
{
 ArrayList jobs = new ArrayList();

 public synchronized void put(Runnable job)
 {
  jobs.add(job);
  this.notifyAll();
 }

 public synchronized Runnable getJob()
 {
  while (jobs.size() == 0)
   this.wait();

  return jobs.remove(0);
 }
}

"Mayroon kaming getJob method na nagsusuri kung ang listahan ng gawain ay walang laman. Ang thread pagkatapos ay matutulog (naghihintay) hanggang sa may lumitaw sa listahan."

"Mayroon ding put method, na nagbibigay-daan sa iyong magdagdag ng bagong gawain sa listahan. Sa sandaling maidagdag ang isang bagong gawain, tatawagin ang notifyAll method. Ang pagtawag sa paraang ito ay gumising sa lahat ng thread ng manggagawa na nakatulog sa loob ng getJob method."

"Naaalala mo ba muli kung paano gumagana ang mga pamamaraan ng paghihintay at pag-abiso?"

"Ang paraan ng paghihintay ay tinatawag lamang sa loob ng isang naka-synchronize na bloke, sa isang mutex object. Sa aming kaso: ito. Bukod dito, dalawang bagay ang nangyayari:

1) Nakatulog ang thread.

2) Pansamantalang nilalabas ng thread ang mutex (hanggang sa magising).

"Pagkatapos nito, maaaring pumasok ang ibang mga thread sa naka-synchronize na block at makuha ang parehong mutex."

" Maaari ding tawagan ang paraan ng notifyAll sa loob ng naka-synchronize na block ng isang mutex object. Sa aming kaso: ito. Bukod dito, dalawang bagay ang mangyayari:"

1) Ang lahat ng mga thread na naghihintay sa mutex object na ito ay nagising.

2) Kapag ang kasalukuyang thread ay lumabas sa naka-synchronize na bloke, ang isa sa mga nagising na thread ay nakakakuha ng mutex at nagpapatuloy sa trabaho nito. Kapag inilabas nito ang mutex, ang isa pang nagising na thread ay nakakakuha ng mutex, atbp.

"Ito ay halos kapareho ng isang bus. Pumasok ka at gusto mong magbayad ng iyong pamasahe, ngunit walang driver. Kaya «makatulog ka». Maya-maya, puno na ang bus, ngunit wala pa ring magbibigay ng pamasahe. Pagkatapos ay ang driver. dumating at nagsabi, «Pamasahe, pakiusap». At ito ang simula ng…"

"Interesting comparison. Pero ano ang bus?"

"Ipinaliwanag ito ni Julio. May mga kakaibang bagay na ginamit noong 21st century."