Ing

"Hai, Amigo!"

"Aku pengin nyilem jero karo sampeyan babagan ngenteni-ngabari. Cara ngenteni-ngabari nyedhiyakake mekanisme sing trep kanggo sesambungan benang. Uga bisa digunakake kanggo mbangun mekanisme tingkat dhuwur sing rumit kanggo interaksi benang."

"Aku bakal miwiti karo conto cilik. Upamane kita duwe program kanggo server sing kudu nindakake macem-macem tugas sing digawe dening pangguna liwat situs web. Pangguna bisa nambah macem-macem tugas ing wektu sing beda-beda. Tugas kasebut intensif sumber daya, nanging server kita 8 -prosesor inti bisa ngrampungake. Kepiye carane nindakake tugas ing server?"

"Kaping pisanan, kita bakal nggawe klompok utas buruh, minangka akeh sing ana inti prosesor. Saben thread bakal bisa mbukak ing inti dhewe: Utas ora bakal ngganggu saben liyane, lan inti prosesor ora bakal. lungguh nganggur."

"Kapindho, kita bakal nggawe obyek antrian ing ngendi tugas pangguna bakal ditambahake. Jinis tugas sing beda-beda bakal cocog karo obyek sing beda-beda, nanging kabeh mau bakal ngetrapake antarmuka Runnable supaya bisa ditindakake."

"Apa sampeyan bisa menehi conto obyek tugas?"

"Cek iki:"

Kelas sing ngétung n faktorial nalika run () cara disebut
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;
 }
}

"Saiki, apik banget."

"Apik. Banjur ayo ditliti carane obyek antrian kudu katon. Apa sampeyan bisa ngomong babagan iki?"

"Sampeyan kudu thread-aman. Diiseni obyek tugas dening thread sing ditampa saka pangguna, lan banjur tugas dijupuk dening thread buruh."

"Ya. Lan yen kita kehabisan tugas kanggo sawetara wektu?"

"Banjur benang buruh kudu ngenteni nganti ana liyane."

"Bener. Saiki mbayangno yen kabeh iki bisa dibangun ing antrian siji. Priksa: "

Antrian tugas. Yen ora ana tugas, benang bakal turu lan ngenteni siji katon:
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);
 }
}

"Kita duwe metode getJob sing mriksa manawa dhaptar tugas kosong. Utas banjur turu (ngenteni) nganti ana sing katon ing dhaptar."

"Ana uga metode put , sing ngidini sampeyan nambahake tugas anyar menyang dhaptar. Sanalika tugas anyar ditambahake, metode notifyAll diarani. Nelpon metode iki awakens kabeh benang pekerja sing turu ing metode getJob."

"Apa sampeyan bisa ngelingi maneh cara kerjane ngenteni lan ngabari?"

"Cara ngenteni mung diarani ing blok sing disinkronake, ing obyek mutex. Ing kasus kita: iki. Kajaba iku, ana rong perkara:

1) Utas keturon.

2) Utas sementara ngeculake mutex (nganti tangi).

"Sawise, benang liyane bisa mlebu blok sing disinkronake lan entuk mutex sing padha."

" Cara notifyAll uga mung bisa diarani ing blok sinkronisasi obyek mutex. Ing kasus kita: iki. Kajaba iku, ana rong perkara: "

1) Kabeh Utas nunggu ing obyek mutex iki awakened.

2) Sawise benang saiki metu saka blok sing disinkronake, salah sijine benang sing awakened entuk mutex lan nerusake karyane. Nalika ngeculake mutex, benang awakened liyane entuk mutex, lsp.

"Iku meh padha karo bis. Sampeyan mlebu lan pengin mbayar karcis, nanging ora ana sopir. Dadi sampeyan "turu". Akhire bis wis rame, nanging isih ora ana sing menehi beya. Banjur sopir. teka lan kandha, "Mbok, tulung". Lan iki wiwitane..."

"Bandhingan sing menarik. Nanging bis apa?"

"Julio nerangake babagan iki. Ana barang-barang aneh sing digunakake ing abad kaping 21."