Produser-Konsumer

Sekarang kita mempunyai solusi problem produser-konsumer yang menggunakan penyampaian pesan. Produser dan konsumer akan berkomunikasi secara tidak langsung menggunakan mailbox yang dibagi. Buffer menggunakan java.util.Vector class sehingga buffer mempunyai kapasitas tak terhingga. Dan send() dan read() method adalah nonblocking. Ketika produser memproduksi suatu item, item tersebut diletakkan ke mailbox melalui send() method. Konsumer menerima item dari mailbox menggunakan receive() method. Karena receive() nonblocking, consumer harus mengevaluasi nilai dari Object yang di-return dari receive(). Jika null, mailbox kosong.

import java.util.*;

public class Producer extends Thread {
     private MessageQueueueue mbox;

     public Producer( MessageQueueueue m ) {
         mbox = m;
     }

     public void run() {
         Date message;

         while ( true ) {
              int sleeptime = ( int ) ( Server.NAP_TIME * Math.random() );
System.out.println( "Producer sleeping for " +
      sleeptime + " seconds" );
try {
       Thread.sleep(sleeptime*1000);
} catch( InterruptedException e ) {}

message = new Date();
System.out.println( "Producer produced " + message );
mbox.send( message );
      }
    }
}
import java.util.*;

public class Consumer extends Thread {
        private MessageQueueueue mbox;

        public Consumer( MessageQueueueue m ) {
                 mbox = m;
        }

public void run() {
        Date message;

        while ( true ) {
int sleeptime = (int) (Server.NAP_TIME * Math.random());
System.out.println("Consumer sleeping for " +
     sleeptime + " seconds" );
try {
    Thread.sleep( sleeptime * 1000 );
} catch( InterruptedException e ) {}

message = ( Date ) mbox.receive();
if ( message != null )
     System.out.println("Consumer consume " + message );
          }
      }
}

Program Produser Konsumer Alternatif.

Kita memiliki dua aktor di sini, yaitu Produser dan Konsumer. Produser adalah thread yang
menghasilkan waktu (Date) kemudian menyimpannya ke dalam antrian pesan. Produser juga mencetak waktu tersebut di layer (sebagai umpan balik bagi kita). Konsumer adalah thread yang akan mengakses antrian pesan untuk mendapatkan waktu (date) itu dan tak lupa mencetaknya di layer. Kita menginginkan supaya konsumer itu mendapatkan waktu sesuatu dengan urutan sebagaimana produser menyimpan waktu tersebut. Kita akan menghadapi salah satu dari dua kemungkinan situasi di bawah ini:

Bila p1 lebih cepat dari c1, kita akan memperoleh output sebagai berikut:

……….
Consumer consume Wed May 07 14:11:12 ICT 2003
Consumer sleeping for 3 seconds
Producer produced Wed May 07 14:11:16 ICT 2003
Producer sleeping for 4 seconds
// p1 sudah mengupdate isi mailbox waktu dari Wed May 07
// 14:11:16 ICT 2003 ke Wed May 07 14:11:17 ICT 2003,
// padahal c1 belum lagi mengambil waktu Wed May 07 14:11:16
Producer produced Wed May 07 14:11:17 ICT 2003
Producer sleeping for 4 seconds
Consumer consume Wed May 07 14:11:17 ICT 2003
Consumer sleeping for 4 seconds
// Konsumer melewatkan waktu Wed May 07 14:11:16
. . .
Keluaran Program Produser Konsumer.

Bila p1 lebih lambat dari c1, kita akan memperoleh keluaran seperti berikut:

. . .
Producer produced Wed May 07 14:11:11 ICT 2003
Producer sleeping for 1 seconds
Consumer consume Wed May 07 14:11:11 ICT 2003
Consumer sleeping for 0 seconds
// c1 sudah mengambil isi dari mailbox, padahal p1 belum
// lagi megupdate isi dari mailbox dari May 07 14:11:11
// ICT 2003 ke May 07 14:11:12 ICT 2003, c1 mendapatkan
// waktu Wed May 07 14:11:11 ICT 2003 dua kali.
Consumer consume Wed May 07 14:11:11 ICT 2003
Consumer sleeping for 0 seconds
Producer sleeping for 0 seconds
Producer produced Wed May 07 14:11:12 ICT 2003
. . .
Keluaran Program Produser Konsumer.


Situasi di atas dikenal dengan race conditions. Kita dapat menghindari situasi itu dengan
mensinkronisasikan aktivitas p1 dan c1 (sehubungan dengan akses mereka ke mailbox). 

0 Response to "Produser-Konsumer"

Posting Komentar

powered by Blogger | WordPress by Newwpthemes | Converted by BloggerTheme