Program Hompimpah terdiri dari 4 class yaitu class Hompimpah, class Pemain, class Gambreng, class Semafor. Masing-masing class berfungsi sebagai berikut:
Class Hompimpah: dalam kelas ini program Hompimpah dapat dijalankan
Class Gambreng: dalam kelas ini seluruh proses permainan Hompimpah dijalankan.
Class Semafor: kelas ini menjalankan proses sinkronisasi.
Class Hompimpah: dalam kelas
terdapat fungsi
run() dengan fungsi ini tiap-tiap
pemain akan dihidupkan.
Penjelasan selengkapnya sebagai berikut:
Contoh 27.2. Class Hompimpah
001 public class Hompimpah
002 {
003
004 private static final int JUMLAH_PEMAIN=6;
005 public static void main(String args[])throws Exception
006 {
007 Gambreng gamserver=new Gambreng(JUMLAH_PEMAIN);
008 Thread[] pemain=new Thread[JUMLAH_PEMAIN];
009 for (int ii=0; ii<JUMLAH_PEMAIN; ii++)
010 {
011 pemain[ii]= new Thread (new Pemain(gamserver, ii));
012 pemain[ii].start();
013
014 }
015 gamserver.bandarGambreng();
017 }
018
019 }
020
Pada
class Hompimpah, dibuat objek baru
dari
class Gambreng (baris 7), dimana
dalam kelas tersebut dibuat 2 jenis
thread yaitu thread bandar dan
thread pemain. Masing-masing
thread adalah
array dari objek Semafor, yang
berkapasitas JUMLAH_PEMAIN, yaitu 6. Kemudian kedua jenis
thread di set
value-nya sebagai 0 (terdapat pada
class Gambreng). Hal ini
mengindikasikan bahwa
thread bandar dan pemain sedang
tidur. Dalam kelas Gambreng, mutex sebagai objek dari
class Semafor, di set 1,yang
berarti bahwa
critical section sedang dalam
keadaan
available atau tidak ada
thread yang sedang memakai.
Kemudian iterasiGambreng di set 0 dan pemanggilan
method
resetGambreng() pada
class Gambreng sebagai penanda awal
permainan
Pada baris ke 8
class Hompimpah dibuat
array object baru dari
class Thread yaitu pemain sebanyak
JUMLAH_PEMAIN yang di set 6. Tiap-tiap
thread memiliki
no_pemain dan memiliki objek dari
class Gambreng. Selanjutnya
thread- thread tersebut menjalankan
method
run()-nya, dimana dalam
method tersebut tiap-tiap
thread pemain mengirimkan nomornya
untuk diakses dalam
method
pemainGambreng(int) yang berada pada
class Gambreng.
Contoh 27.3. method pemainGambreng
078 public void pemainGambreng (int nomor)
079 {
080 syncBandarPemain(nomor);
081 while(!menangGambreng())
082 {
083 mutex.kunci();
084
085 if((int)(Math.random()*2)==1)
086 {
087 truePemain=nomor;
088 trueCount++;
089
090 }
091 else
092 {
093 falsePemain=nomor;
094 falseCount++;
095 }
096 mutex.buka();
097 syncBandarPemain(nomor);
098 }
099 }
100 public void resetGambreng()
101 {
102 mutex.kunci();
103 adaPemenang=false;
104 truePemain=0;
105 trueCount=0;
106 falsePemain=0;
107 falseCount=0;
108
109 mutex.buka();
110 }
111
Pada fungsi tersebut tiap-tiap
thread akan mengakses
critical section secara bergantian,
sesuai dengan prinsip
mutual exclusion. Di dalam
critical section,
thread-thread akan dicek apakah
truePemain(telapak) atau falsePemain(punggung) kemudian dihitung
berapa jumlah telapak dan punggungnya. Proses ini akan terus me-
loop sampai ada pemenang. Sebelum
memasuki
critical section dan melakukan
pengecekan, sistem melakukan proses sinkronisasi bandar dan
pemain, dengan memangil fungsi
syncBandarPemain()
Contoh 27.4. syncBandarPemain
155 private void syncBandarPemain(int ii)
156 {
157 bandar[ii].buka();
158 pemain[ii].kunci();
159 }
160
dalam fungsi tersebut bandar melepaskan kunci, dan
memanggil
thread pemain dengan
notify() yang merupakan bagian dari fungsi
buka() dari
class Semafor, untuk kemudian
thread tersebut dapat mengakses
critical section.
Setelah seluruh
thread pemain mengakses
critical section dan melakukan
pengecekan, program memanggil fungsi
bandarGambreng() pada
class Gambreng,untuk melakukan
proses sinkronisasi bandar yaitu memanggil fungsi
syncBandar()
Contoh 27.5. syncBandar
141 private void syncBandar()
142 {
143 for(int ii=0;ii<jumlahPemain;ii++)
144 {
145 bandar[ii].kunci();
146 }
147 }
, sehingga bandar terkunci dalam
critical section dan memegang
kekuasaan dalam Gambreng untuk melakukan perulangan fungsi-fungsi
berikut, yang masing-masing akan dipanggil dalam fungsi
bandarGambreng():
Me-reset permainan gambreng dengan memanggil fungsi
resetGambreng().
Contoh 27.6. resetGambreng
100 public void resetGambreng()
101 {
102 mutex.kunci();
103 adaPemenang=false;
104 truePemain=0;
105 trueCount=0;
106 falsePemain=0;
107 falseCount=0;
108
109 mutex.buka();
110 }
111
Dalam fungsi
resetGambreng(),
truePemain,
falsePemain,
trueCount dan
falseCount= 0, kemudian ada pemenang
diset false, sebagai tanda awal dari permainan.
Melakukan sinkronisasi pemain dan bandar dengan
memanggil fungsi
syncPemainBandar().
Contoh 27.7. syncPemainBandar
132 private void syncPemainBandar()
133 {
134 for(int ii=0; ii<jumlahPemain;ii++)
135 {
136 pemain[ii].buka();
137 bandar[ii].kunci();
138 }
139 }
Ketika melakukan pemanggilan fungsi ini, seluruh
pemain dibangunkan kemudian tiap-tiap bandar akan tidur.
Dengan fungsi ini, bandar akan tetap menunggu sampai semua
pemain membangunkannya. Dan ketika bandar bangun, pemain
akan ditidurkan kembali.
Melakukan penghitungan dengan fungsi
hitungGambreng()
Contoh 27.8. hitungGambreng
116 private void hitungGambreng()
117 {
118 mutex.kunci();
119
120 if(trueCount==1)
121 {
122 adaPemenang=true;
123 nomorPemenang=truePemain;
124 }
125 else(falseCount==1)
126 {
127 adaPemenang=true;
128 nomorPemenang=falsePemain;
129 }
130 mutex.buka();
131 }
Dengan fungsi ini, kembali melakukan pengaksesan
variable. Dengan melakukan pengecekan, apabila salah satu
diantara trueCount atau falseCount bernilai 1, maka
adaPemenang. Nilai ini akan diproses oleh fungsi
menangGambreng(), yang akan
mengembalikan nilai boolean(true atau false). Jika fungsi
tersebut bernilai
true maka proses loop
berhenti.
Menghitung iterasi perulangan, sampai fungsi
menangGambreng() mengembalikan nilai
true, yang menandakan adanya
pemenang.
Saat proses perulangan berhenti, pemain melepaskan kunci
kemudian sistem menampilkan output saat
execute, berupa
no_pemain yang keluar sebagai pemenang.
Setiap proses execute akan menampilkan nomor pemain yang
berbeda-beda , karena proses random dan urutan pengaksesan
critical section oleh thread pada
tiap peng-
execute-an berbeda-beda.
Contoh 27.9. Keluaran Program
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[3] Jumlah Iterasi[12]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[2] Jumlah Iterasi[1]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[0] Jumlah Iterasi[6]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[4] Jumlah Iterasi[2]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[1] Jumlah Iterasi[14]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[3] Jumlah Iterasi[9]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[5] Jumlah Iterasi[3]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[3] Jumlah Iterasi[2]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[4] Jumlah Iterasi[5]
Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[0] Jumlah Iterasi[11]
Contoh di atas menunjukkan hasil Hompimpah tidak selalu sama. Jumlah iterasi menunjukkan berapa kali bandar menyerukan gambreng dan mengulang permainan.