Modul B
Laporan Sistem Operasi
Modul B
Disusun Oleh :
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.
- 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();
}
}
Komentar
Posting Komentar