Advertisement
Guest User

ReaderWriterServer

a guest
Apr 18th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.54 KB | None | 0 0
  1. public class ReaderWriterServer{
  2.     public static void main(String args[]){
  3.         Database server = new Database();
  4.         Reader[] readerArray = new Reader[NUM_OF_READERS];
  5.         Writer[] writerArray = new Writer[NUM_OF_WRITERS];
  6.  
  7.         for(int i = 0;i < NUM_OF_READERS;i++){
  8.             readerArray[i] = new Reader(i, server);
  9.             readerArray[i].start();
  10.         }
  11.  
  12.         for(int i = 0;i < NUM_OF_WRITERS;i++){
  13.             writerArray[i] = new Writer(i, server);
  14.             writerArray[i].start();
  15.         }
  16.     }
  17.  
  18.     private static final int NUM_OF_READERS = 3;
  19.     private static final int NUM_OF_WRITERS = 2;
  20. }
  21.  
  22. class Reader extends Thread{
  23.     public Reader(int r, Database db){
  24.         readerNum = r;
  25.         server = db;
  26.     }
  27.  
  28.     public void run(){
  29.         int c;
  30.         while(true){
  31.             Database.tunggu();
  32.             System.out.println("reader "+readerNum+" wants to read");
  33.             c = server.mulaiBaca();
  34.             System.out.println("reader "+readerNum + " is reading. Reader Count = "+c);
  35.             Database.tunggu();
  36.             System.out.println("reader "+readerNum+" is done reading.");
  37.             c = server.selesaiBaca();
  38.         }
  39.     }
  40.  
  41.     private Database server;
  42.     private int readerNum;
  43. }
  44.  
  45. class Writer extends Thread{
  46.     public Writer(int w, Database db){
  47.         writerNum = w;
  48.         server = db;
  49.     }
  50.  
  51.     public void run(){
  52.         while(true){
  53.             // System.out.println("writer "+writerNum+" is sleeping.");
  54.             // Database.tunggu();
  55.             System.out.println("writer "+writerNum+" wants to write.");
  56.             server.mulaiTulis();
  57.             System.out.println("writer "+writerNum+" is writing.");
  58.             Database.tunggu();
  59.             System.out.println("writer "+writerNum+" is done writing.");
  60.             server.selesaiTulis();
  61.         }
  62.     }
  63.     private Database server;
  64.     private int writerNum;
  65. }
  66.  
  67. final class Semaphore{
  68.     public Semaphore(){
  69.         value = 0;
  70.     }
  71.  
  72.     public Semaphore(int v){
  73.         value = v;
  74.     }
  75.  
  76.     public synchronized void tutup(){
  77.         while(value <= 0){
  78.             try{
  79.                 wait();
  80.             } catch (InterruptedException e){
  81.                
  82.             }
  83.         }
  84.         value--;
  85.     }
  86.  
  87.     public synchronized void buka(){
  88.         ++value;
  89.         notify();
  90.     }
  91.  
  92.     private int value;
  93. }
  94.  
  95. class Database{
  96.     public Database(){
  97.         banyakReader = 0;
  98.         mutex = new Semaphore(1);
  99.         db = new Semaphore(1);
  100.     }
  101.  
  102.     public static void tunggu(){
  103.         int sleepTime = (int) (NAP_TIME * Math.random());
  104.         try {
  105.             Thread.sleep(sleepTime*1000);
  106.         } catch (InterruptedException e) {
  107.            
  108.         }
  109.     }
  110.  
  111.     public int mulaiBaca(){
  112.         mutex.tutup();
  113.         ++banyakReader;
  114.         if(banyakReader == 1){
  115.             db.tutup();
  116.         }
  117.         mutex.buka();
  118.         return banyakReader;
  119.     }
  120.  
  121.     public int selesaiBaca(){
  122.         mutex.tutup();
  123.         --banyakReader;
  124.         if(banyakReader == 0){
  125.             db.buka();
  126.         }
  127.         mutex.buka();
  128.         System.out.println("Reader count = "+banyakReader);
  129.         return banyakReader;
  130.     }
  131.  
  132.     public void mulaiTulis(){
  133.         db.tutup();
  134.     }
  135.  
  136.     public void selesaiTulis(){
  137.         db.buka();
  138.     }
  139.  
  140.     public int jumlahReader(){
  141.         return banyakReader;
  142.     }
  143.  
  144.     private int banyakReader;
  145.     Semaphore mutex;
  146.     Semaphore db;
  147.     private static final int NAP_TIME = 15;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement