Penjelasan Program

Program Hompimpah terdiri dari 4 class yaitu class Hompimpah, class Pemain, class Gambreng, class Semafor. Masing-masing class berfungsi sebagai berikut:

  1. Class Hompimpah: dalam kelas ini program Hompimpah dapat dijalankan

  2. Class Gambreng: dalam kelas ini seluruh proses permainan Hompimpah dijalankan.

  3. Class Semafor: kelas ini menjalankan proses sinkronisasi.

  4. 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():

  1. 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.

  2. 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.

  3. 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.

  4. 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.