Modul B

 Laporan Sistem Operasi


Modul B



Disusun Oleh :

Riska Haqika Situmorang
2208107010086








 

JURUSAN INFORMATIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SYIAH KUALA
DARUSSALAM, BANDA ACEH
 2023




1. Example of synchronized method by using annonymous class

 -TestSynchronization3.java



  • private char currentChar = 'a'; adalah variabel anggota kelas Table yang menyimpan karakter saat ini yang akan dicetak. Nilainya diinisialisasi dengan 'a'.
  • synchronized void printAlphabets(char startChar, char endChar)  adalah metode dalam kelas Table yang digunakan untuk mencetak huruf-huruf dalam rentang tertentu. Metode ini diberi kata kunci synchronized, yang mengunci objek Table ketika metode ini dieksekusi, memastikan bahwa hanya satu thread dapat menjalankannya pada suatu waktu.
  • for (char c = startChar; c <= endChar; c++)   adalah loop for yang akan berjalan dari startChar hingga endChar untuk mencetak huruf-huruf dalam rentang yang ditentukan.
  • System.out.println(currentChar);: Ini mencetak karakter saat ini ke layar.
  • try { Thread.sleep(400); } catch (InterruptedException e) { System.out.println(e);  adalah blok try-catch yang menangani pengecualian jika terjadi gangguan saat tidur (sleep). Setiap thread akan tidur selama 400 milidetik setelah mencetak karakter saat ini.
  • Blok kondisional if-else memeriksa apakah currentChar adalah 'z'. Jika ya, maka currentChar direset ke 'a' untuk mengulang urutan abjad. Jika tidak, maka currentChar ditingkatkan untuk mencetak huruf berikutnya dalam urutan abjad.



  • public class TestSynchronization3  adalah deklarasi kelas utama.
  • public static void main(String args[])  adalah metode utama yang akan dieksekusi saat program dimulai.
  • final Table obj = new Table(); Membuat objek dari kelas Table dengan nama obj dan menandainya sebagai final, yang berarti objek ini tidak dapat diubah setelahnya.
  • Thread t1 dan t2 adalah objek thread yang dibuat secara anonim. Masing-masing dari mereka mendefinisikan metode run() secara langsung di dalam objek thread tersebut.
  • Di dalam run() dari t1, objek obj (instance dari Table) digunakan untuk memanggil metode printAlphabets('a', 'm'), yang mencetak huruf-huruf dari 'a' hingga 'm'.
  • Di dalam run() dari t2, objek obj digunakan untuk memanggil metode printAlphabets('n', 'z'), yang mencetak huruf-huruf dari 'n' hingga 'z'.
  • t1.start(); dan t2.start(); digunakan untuk memulai eksekusi kedua thread.

Hasil dari program ini akan mencetak huruf-huruf dalam dua rentang ('a' hingga 'm' dan 'n' hingga 'z') secara bersamaan dengan penguncian sinkronisasi, sehingga urutan cetakan akan berurutan dan tidak bercampur antara kedua thread. Waktu tidur antara setiap karakter yang dicetak adalah 400 milidetik.

    Output diatas menunjukkan bahwa, dua thread, t1 dan t2, mencetak huruf-huruf dalam dua rentang yang berbeda secara bersamaan dengan sinkronisasi. Uniknya, metode run() dari masing-masing thread didefinisikan langsung di dalam kelas anonim yang dibuat saat mendeklarasikan objek thread, tanpa perlu membuat subclass terpisah dari Thread. Hasilnya, urutan cetakan huruf-huruf dalam rentang 'a' hingga 'm' dicetak oleh thread pertama (t1), sementara huruf-huruf dalam rentang 'n' hingga 'z' dicetak oleh thread kedua (t2). Dengan sinkronisasi, urutan cetakan akan selalu berurutan dan konsisten, mengikuti urutan 'a' hingga 'm' oleh thread pertama, dan kemudian 'n' hingga 'z' oleh thread kedua. Penggunaan kelas anonim memungkinkan kita mendefinisikan perilaku thread dengan lebih sederhana tanpa perlu membuat kelas turunan tambahan dari Thread.



2. Example of Synchronized Block

   -TestSynchronizedBlock1.java



  • private char currentChar = 'a'; adalah variabel anggota kelas Table yang menyimpan karakter saat ini yang akan dicetak. Nilainya diinisialisasi dengan 'a'.
  • void printTable(char limitChar)  adalah metode dalam kelas Table yang digunakan untuk mencetak huruf-huruf hingga batas yang ditentukan (limitChar).
  • synchronized (this)  adalah blok synchronized yang mengunci objek saat metode printTable dieksekusi. Hanya satu thread yang dapat menjalankan blok synchronized ini pada suatu waktu.
  • while (currentChar <= limitChar) adalah loop while yang akan berjalan selama currentChar masih kurang dari atau sama dengan limitChar.
  • System.out.println(currentChar); mencetak karakter saat ini ke layar.
  • currentChar++;: Meningkatkan currentChar sehingga thread selanjutnya akan mencetak karakter berikutnya.
  • try { Thread.sleep(400); } catch (InterruptedException e) { System.out.println(e); }: Ini adalah blok try-catch yang menangani pengecualian jika terjadi gangguan saat tidur (sleep). Setiap thread akan tidur selama 400 milidetik setelah mencetak karakter saat ini.



  • class MyThread1 extends Thread adalah deklarasi kelas MyThread1, yang merupakan subclass dari Thread. Thread ini akan digunakan untuk mencetak huruf-huruf hingga 'm'.
  • class MyThread2 extends Thread  adalah deklarasi kelas MyThread2, yang juga merupakan subclass dari Thread. Thread ini akan digunakan untuk mencetak huruf-huruf hingga 'z'.


  • public class TestSynchronizedBlock1 adalah deklarasi kelas utama.
  • public static void main(String args[])  adalah metode utama yang akan dieksekusi saat program dimulai.
  • Table obj = new Table();: Membuat objek dari kelas Table dengan nama obj.
  • MyThread1 t1 = new MyThread1(obj); Membuat objek t1 dari kelas MyThread1 dan melewatkan objek obj sebagai parameter constructor.
  • MyThread2 t2 = new MyThread2(obj); Membuat objek t2 dari kelas MyThread2 dan melewatkan objek obj sebagai parameter constructor.
  • t1.start(); Memulai eksekusi thread t1 dengan memanggil metode start(), yang pada gilirannya akan menjalankan metode run() di dalam MyThread1.
  • t2.start(); Memulai eksekusi thread t2 dengan memanggil metode start(), yang pada gilirannya akan menjalankan metode run() di dalam MyThread2.

    Karena metode printTable memiliki blok synchronized, hanya satu thread yang dapat mengakses blok tersebut pada suatu waktu, sehingga urutan cetakan huruf-huruf dalam kedua rentang akan berurutan dan tidak bercampur. Waktu tidur antara setiap karakter yang dicetak adalah 400 milidetik, sehingga akan ada jeda 400 milidetik antara setiap karakter yang dicetak oleh setiap thread.



    Output diatas menunjukkan bahwa dua thread, MyThread1 dan MyThread2, mencetak huruf-huruf dalam dua rentang yang berbeda secara bersamaan dengan sinkronisasi menggunakan blok synchronized. Kode ini memastikan bahwa hanya satu thread dapat mengakses metode printTable pada satu waktu, menghindari campur aduk karakter yang dicetak oleh kedua thread. Thread pertama (MyThread1) mencetak huruf-huruf dari 'a' hingga 'm', sementara thread kedua (MyThread2) mencetak huruf-huruf dari 'n' hingga 'z'. Karena ada sinkronisasi, urutan cetakan akan berurutan dan konsisten, sehingga hasil cetakannya akan selalu mengikuti urutan 'a' sampai 'm' oleh thread 1, dan kemudian 'n' sampai 'z' oleh thread 2.


3. Synchronized Block Example Using Anonymous Class
    -TestSynchronizedBlock2.java


  • class Sender  Ini adalah deklarasi kelas Sender yang digunakan untuk mengirim pesan.
  • public void SenderMsg(String msg)  Ini adalah metode dalam kelas Sender yang digunakan untuk mengirim pesan. Metode ini menerima pesan sebagai parameter, mencetak pesan yang akan dikirim, tidur selama 800 milidetik (simulasi pengiriman pesan), dan mencetak pesan telah dikirim.


  • class SenderWThreads extends Thread  adalah deklarasi kelas SenderWThreads, yang merupakan subclass dari Thread. Kelas ini digunakan untuk mengirim pesan menggunakan thread.
  • private String msg;: Variabel untuk menyimpan pesan yang akan dikirim.
  • Sender sd;: Variabel untuk menyimpan objek Sender yang akan digunakan untuk mengirim pesan.
  • SenderWThreads(String m, Sender obj) Konstruktor SenderWThreads yang menerima pesan (m) dan objek Sender (obj) sebagai parameter.
  • public void run()  adalah metode run() yang akan dijalankan saat thread dimulai.
  • synchronized(sd) Blok ini menggunakan synchronized untuk memastikan bahwa hanya satu thread dapat mengirim pesan pada satu waktu. Itu memastikan bahwa objek Sender (sd) tidak digunakan secara bersamaan oleh beberapa thread.
  • sd.SenderMsg(msg); Memanggil metode SenderMsg dari objek Sender (sd) untuk mengirim pesan yang tersimpan dalam variabel msg.

  • public class ShynchronizedMultithreading  Ini adalah deklarasi kelas utama.
  • Sender sender = new Sender(); Membuat objek Sender bernama sender.
  • SenderWThreads sender1 = new SenderWThreads( "Hola " , sender);: Membuat objek SenderWThreads bernama sender1 dengan pesan "Hola" dan objek Sender sebagai parameter.
  • SenderWThreads sender2 = new SenderWThreads( "Welcome to Javatpoint website ", sender); Membuat objek SenderWThreads bernama sender2 dengan pesan "Welcome to Javatpoint website" dan objek Sender sebagai parameter.
  • sender1.start(); Memulai eksekusi thread sender1.
  • sender2.start(); Memulai eksekusi thread sender2.
  • try { sender1.join(); sender2.join(); Menggunakan metode join untuk menunggu kedua thread selesai sebelum program utama melanjutkan. join() digunakan untuk menunggu sampai thread selesai menjalankan metodenya.
  • catch(Exception e) { System.out.println("Interrupted"); Menangani pengecualian jika ada kesalahan saat menunggu thread selesai.

    Kode ini mensimulasikan pengiriman pesan asinkronus dari dua thread yang berbeda ke objek Sender, dan penggunaan blok synchronized memastikan bahwa hanya satu thread dapat mengirim pesan pada satu waktu untuk meminimalkan masalah persaingan sumber daya.


    Output diatas menunjukkan bahwa simulasi pengiriman pesan asinkronus dari dua thread ke objek Sender. Thread pertama (sender1) mengirim pesan "Hola", sementara thread kedua (sender2) mengirim pesan "Welcome to Javatpoint website". Karena pengiriman pesan dilakukan dalam metode SenderMsg yang diberi jeda tidur selama 800 milidetik, maka setiap thread akan mencetak pesan pengiriman, tidur selama 800 milidetik, dan kemudian mencetak bahwa pesan telah dikirim. Namun, urutan pasti cetakan bisa bervariasi karena penggunaan thread, tergantung pada bagaimana sistem mengelola eksekusi thread. Penggunaan synchronized pada blok kritis memastikan bahwa hanya satu thread dapat mengakses objek Sender pada satu waktu, menghindari potensi masalah persaingan sumber daya.


LAMPIRAN :


 -TestSynchronization3.java

//Program of synchronized method by using annonymous class  

class Table {

    private char currentChar = 'a'; // Start with 'a'


    synchronized void printAlphabets(char startChar, char endChar) {

        for (char c = startChar; c <= endChar; c++) {

            System.out.println(currentChar);

            try {

                Thread.sleep(400);

            } catch (InterruptedException e) {

                System.out.println(e);

            }


            if (currentChar == 'z') {

                currentChar = 'a'; // Reset to 'a' after 'z'

            } else {

                currentChar++;

            }

        }

    }

}


public class TestSynchronization3 {

    public static void main(String args[]) {

        final Table obj = new Table(); // Hanya satu objek


        Thread t1 = new Thread() {

            public void run() {

                obj.printAlphabets('a', 'm');

            }

        };


        Thread t2 = new Thread() {

            public void run() {

                obj.printAlphabets('n', 'z');

            }

        };


        t1.start();

        t2.start();

    }

}



-TestSynchronizedBlock1.java

class Table {

    private char currentChar = 'a';


    void printTable(char limitChar) {

        synchronized (this) {

            while (currentChar <= limitChar) {

                System.out.println(currentChar);

                currentChar++;

                try {

                    Thread.sleep(400);

                } catch (InterruptedException e) {

                    System.out.println(e);

                }

            }

        }

    }

}


class MyThread1 extends Thread {

    Table t;


    MyThread1(Table t) {

        this.t = t;

    }


    public void run() {

        t.printTable('m');

    }

}


class MyThread2 extends Thread {

    Table t;


    MyThread2(Table t) {

        this.t = t;

    }


    public void run() {

        t.printTable('z');

    }

}


public class TestSynchronizedBlock1 {

    public static void main(String args[]) {

        Table obj = new Table(); // hanya satu objek

        MyThread1 t1 = new MyThread1(obj);

        MyThread2 t2 = new MyThread2(obj);

        t1.start();

        t2.start();

    }

}



-TestSynchronizedBlock2.java

// A Sender class  
class Sender   
{   
  public void SenderMsg(String msg)  
  {   
    System.out.println("\nSending a Message: "  + msg);  
    try  
    {   
      Thread.sleep(800);   
    }   
    catch (Exception e)   
    {   
      System.out.println("Thread interrupted.");   
    }   
    System.out.println("\n" +msg+ "Sent");  
  }  
}   
// A Sender class for sending a message using Threads   
class SenderWThreads extends Thread   
{   
  private String msg;   
  Sender sd;   
  
  // Receiver method to receive a message object and a message to be sent   
  SenderWThreads(String m, Sender obj)  
  {   
    msg = m;  
    sd = obj;   
  }   
  
  public void run()   
  {   
    // Checks that only one thread sends a message at a time.   
    synchronized(sd)   
    {   
      // synchronizing the sender object   
      sd.SenderMsg(msg);  
    }   
  }   
}   
// Driver Code   
public class ShynchronizedMultithreading  
{   
  public static void main(String args[])   
  {   
    Sender sender = new Sender();   
    SenderWThreads sender1 = new SenderWThreads( "Hola " , sender);  
SenderWThreads sender2 =  new SenderWThreads( "Welcome to Javatpoint website ", sender);  
  
    // Start two threads of SenderWThreads type   
    sender1.start();   
    sender2.start();   
  
    // wait for threads to end   
    try  
    {   
      sender1.join();   
      sender2.join();   
    }   
    catch(Exception e)   
    {   
      System.out.println("Interrupted");   
    }   
  }   
}  


    Komentar