Modul C

 Laporan Sistem Operasi


Modul C



Disusun Oleh :

Riska Haqika Situmorang
2208107010086








 

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





1. Static Synchronization
 -TestSynchronization4.java


  • private static char currentChar = 'a'; Ini adalah variabel anggota kelas Table yang digunakan untuk menyimpan karakter saat ini yang akan dicetak. Variabel ini bersifat static, yang berarti nilainya bersamaan untuk semua instance objek Table.
  • synchronized static void printRange(char startChar, char endChar)  adalah metode dalam kelas Table yang digunakan untuk mencetak karakter dalam rentang tertentu. Metode ini diberi kata kunci synchronized dan bersifat static, sehingga hanya satu thread yang dapat menjalankannya pada satu waktu.
  • for (char c = startChar; c <= endChar && currentChar <= 'z'; c++)  adalah loop for yang akan mencetak karakter dalam rentang yang ditentukan. Selain itu, ada juga kondisi yang memeriksa apakah karakter saat ini masih dalam rentang 'a' hingga 'z'.
  • System.out.println(currentChar);: Ini mencetak karakter saat ini ke layar.
  • currentChar++;: Meningkatkan currentChar sehingga thread selanjutnya akan mencetak karakter berikutnya.
  • try { Thread.sleep(400); } catch (InterruptedException e) { e.printStackTrace();  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 {: Ini adalah deklarasi kelas MyThread1, yang merupakan subclass dari Thread.
  • public void run()  adalah metode run() yang akan dijalankan saat thread dimulai.
  • Table.printRange('a', 'g'); Memanggil metode printRange dari kelas Table untuk mencetak karakter dari 'a' hingga 'g'.
  • Sama seperti langkah 9-11, kode ini mendefinisikan MyThread2 untuk mencetak karakter dari 'h' hingga 'l', MyThread3 untuk mencetak karakter dari 'j' hingga 'q', dan MyThread4 untuk mencetak karakter dari 'r' hingga 'z'.



  • public class TestSynchronization4  Ini adalah deklarasi kelas utama.
  • public static void main(String t[]) adalah metode utama yang akan dieksekusi saat program dimulai.
  • MyThread1 t1 = new MyThread1(); Membuat objek MyThread1 dengan nama t1.
  • MyThread2 t2 = new MyThread2(); Membuat objek MyThread2 dengan nama t2.
  • MyThread3 t3 = new MyThread3(); Membuat objek MyThread3 dengan nama t3.
  • MyThread4 t4 = new MyThread4(); Membuat objek MyThread4 dengan nama t4.
  • t1.start();: Memulai eksekusi t1.
  • t2.start();: Memulai eksekusi t2.
  • t3.start();: Memulai eksekusi t3.
  • t4.start();: Memulai eksekusi t4.

    Kode ini menggunakan empat thread untuk mencetak karakter dalam beberapa rentang yang berbeda dan memastikan bahwa hanya satu thread dapat menjalankan metode printRange pada satu waktu, sehingga karakter yang dicetak akan berurutan dan tidak saling bercampur.


    Output diatas menunjukkan bahwa empat thread, MyThread1, MyThread2, MyThread3, dan MyThread4, secara bersamaan mencetak karakter dalam beberapa rentang yang berbeda. Masing-masing thread mencetak karakter dalam rentang yang ditentukan oleh pemanggilan metode printRange dari kelas Table. Karena metode printRange menggunakan kata kunci synchronized, hanya satu thread yang dapat menjalankannya pada satu waktu. Kode ini memastikan bahwa karakter yang dicetak akan berurutan dan tidak ada karakter yang hilang atau tumpang tindih. Dalam contoh ini, karakter 'a' hingga 'g' dicetak oleh MyThread1, karakter 'h' hingga 'l' dicetak oleh MyThread2, karakter 'j' hingga 'q' dicetak oleh MyThread3, dan karakter 'r' hingga 'z' dicetak oleh MyThread4. Waktu tidur 400 milidetik antara setiap karakter yang dicetak memberikan jeda dalam output yang memungkinkan Anda untuk melihat urutan karakter yang sesuai.



2. Example of static synchronization by Using the anonymous class
 -TestSynchronization5.java



  • class Table  Ini adalah deklarasi kelas Table.
  • private static char currentChar = 'a'; adalah variabel anggota kelas Table yang digunakan untuk menyimpan karakter saat ini yang akan dicetak. Variabel ini bersifat static, yang berarti nilainya bersamaan untuk semua instance objek Table.
  • synchronized static void printRange(char startChar, char endChar)  adalah metode dalam kelas Table yang digunakan untuk mencetak karakter dalam rentang tertentu. Metode ini diberi kata kunci synchronized dan bersifat static, sehingga hanya satu thread yang dapat menjalankannya pada satu waktu.
  • for (char c = startChar; c <= endChar; c++)  adalah loop for yang akan mencetak karakter dalam rentang yang ditentukan.
  • if (currentChar > 'z') { break;  adalah kondisi untuk keluar dari loop jika karakter saat ini melebihi 'z'. Ini memastikan bahwa hanya karakter 'a' hingga 'z' yang akan dicetak.
  • System.out.println(currentChar); Ini mencetak karakter saat ini ke layar.
  • currentChar++;: Meningkatkan currentChar sehingga thread selanjutnya akan mencetak karakter berikutnya.
  • try { Thread.sleep(400); } catch (InterruptedException e) { e.printStackTrace(); }: 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.

  • public class TestSynchronization5 adalah deklarasi kelas utama.
  • public static void main(String[] args) adalah metode utama yang akan dieksekusi saat program dimulai.
  • Thread t1 = new Thread() Membuat objek Thread (t1) dan mendefinisikan metode run()-nya secara anonim.
  • Table.printRange('a', 'g'); Memanggil metode printRange dari kelas Table untuk mencetak karakter dari 'a' hingga 'g'.
  • t1.start();: Memulai eksekusi t1.
  • Thread t2 = new Thread() Membuat objek Thread (t2) dengan metode run() yang didefinisikan secara anonim.
  • Table.printRange('h', 'l'); Memanggil metode printRange untuk mencetak karakter dari 'h' hingga 'l'.
  • t2.start();: Memulai eksekusi t2.
  • Sama seperti langkah 22-27, kode ini membuat objek Thread (t3) untuk mencetak karakter dari 'j' hingga 'q'.
  • t3.start();: Memulai eksekusi t3.
  • Sama seperti langkah 22-27, kode ini membuat objek Thread (t4) untuk mencetak karakter dari 'r' hingga 'z'.
  • t4.start();: Memulai eksekusi t4

Kode ini menggunakan thread untuk mencetak karakter dalam rentang yang berbeda dan memastikan bahwa hanya satu thread dapat menjalankan metode printRange pada satu waktu, sehingga karakter yang dicetak akan berurutan dan tidak saling bercampur.


    Output diatas menunjukkan bahwa empat thread, t1, t2, t3, dan t4, secara bersamaan mencetak karakter dalam beberapa rentang yang berbeda. Masing-masing thread mencetak karakter dalam rentang yang ditentukan dengan menggunakan metode printRange dari kelas Table. Karena metode printRange menggunakan kata kunci synchronized, hanya satu thread yang dapat menjalankannya pada satu waktu. Kode ini memastikan bahwa karakter yang dicetak akan berurutan dan tidak ada karakter yang hilang atau tumpang tindih. Dalam contoh ini, karakter 'a' hingga 'g' dicetak oleh t1, karakter 'h' hingga 'l' dicetak oleh t2, karakter 'j' hingga 'q' dicetak oleh t3, dan karakter 'r' hingga 'z' dicetak oleh t4.


LAMPIRAN :


 -TestSynchronization4.java


class Table {

    private static char currentChar = 'a';


    synchronized static void printRange(char startChar, char endChar) {

        for (char c = startChar; c <= endChar && currentChar <= 'z'; c++) {

            System.out.println(currentChar);

            currentChar++;


            try {

                Thread.sleep(400);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}


class MyThread1 extends Thread {

    public void run() {

        Table.printRange('a', 'g');

    }

}


class MyThread2 extends Thread {

    public void run() {

        Table.printRange('h', 'l');

    }

}


class MyThread3 extends Thread {

    public void run() {

        Table.printRange('j', 'q');

    }

}


class MyThread4 extends Thread {

    public void run() {

        Table.printRange('r', 'z');

    }

}


public class TestSynchronization4 {

    public static void main(String t[]) {

        MyThread1 t1 = new MyThread1();

        MyThread2 t2 = new MyThread2();

        MyThread3 t3 = new MyThread3();

        MyThread4 t4 = new MyThread4();

        t1.start();

        t2.start();

        t3.start();

        t4.start();

    }

}




-TestSynchronization5.java


class Table {
    private static char currentChar = 'a';

    synchronized static void printRange(char startChar, char endChar) {
        for (char c = startChar; c <= endChar; c++) {
            if (currentChar > 'z') {
                break; // Keluar dari loop jika karakter melebihi 'z'
            }

            System.out.println(currentChar);
            currentChar++;

            try {
                Thread.sleep(400);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class TestSynchronization5 {
    public static void main(String[] args) {

        Thread t1 = new Thread() {
            public void run() {
                Table.printRange('a', 'g');
            }
        };

        Thread t2 = new Thread() {
            public void run() {
                Table.printRange('h', 'l');
            }
        };

        Thread t3 = new Thread() {
            public void run() {
                Table.printRange('j', 'q');
            }
        };

        Thread t4 = new Thread() {
            public void run() {
                Table.printRange('r', 'z');
            }
        };

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

Komentar