Minggu, 16 Desember 2018

Modul 8 Thread dan Multithreading

Modul 8
Thread dan Multithreading

A.     Tujuan
1.       Memahami Thread pada Java
2.       Memahami penggunaan Thread.

B.     Thread
1. Thread adalah sekumpulan instruksi (proses) yang dieksekusi secara independen
2. Multithreading adalah suatu kemampuan yang memungkinkan beberapa kumpulan instruksi (proses) dijalankan secara bersamaan (time slicing) dalam sebuah program.
3. Multithreading bermanfaat untuk membuat proses yang interaktif, misalanya pada program permainan (game). Program tetap dapat menggerakan beberapa objek sambil member kesempatan pengguna melakukan respon melalui mouse atau keyboard.

File name : ThreadBeraksi1.java
class Mobil implements Runnable{
   String nama;
   public Mobil(String id){
      nama = id;
   }
  
   public void run(){
      for(int i=0; i<5 ; i++){
        try{
              Thread.currentThread().sleep(1000);
        }catch(InterruptedException ie){
              System.out.println("Terinturipsi");
        }
        System.out.println("Thread :"+nama+":posisi"+i);
      }
   }
}

public class ThreadBeraksi1 {
   public static void main (String[] args) {
      Thread m1 = new Thread(new Mobil("M-1"));
      Thread m2 = new Thread(new Mobil("M-2"));
      m1.start();
      m2.start();
   }   
}


 

File name : ThreadBeraksi2.java
class Mobil extends Thread{
   public Mobil(String id){
      super(id);
   }
   public void run(){
      String nama = getName();
      for(int i=0; i<5; i++){
        try{
           sleep(1000);
        }catch(InterruptedException ie){
           System.out.println("Terinterupsi");
        }
        System.out.println("Thread "+nama+" : Posisi "+i);
      }
   }
}

public class ThreadBeraksi2 {
   public static void main (String[] args) {
      Mobil m1 = new Mobil("M-1");
      Mobil m2 = new Mobil("M-2");
      m1.start();
      m2.start();
   }   
}




File name : ThreadBeraksi3.java
class Mobil extends Thread{
   public Mobil(String id){
      super(id);
   }
   public void run(){
      String nama = getName();
      for(int i=0; i<5; i++){
        try{
           sleep(1000);
        }catch(InterruptedException ie){
           System.out.println("Terinterupsi");
        }
        System.out.println("Thread "+nama+" : Posisi "+i);
      }
   }
}

public class ThreadBeraksi3 {
   public static void main (String[] args) {
      Mobil m1 = new Mobil("M-1");
      Mobil m2 = new Mobil("M-2");
      m1.start();
      m2.start();
     
      boolean m1Berakhir = false;
      boolean m2Berakhir = false;
     
      do{
        if(!m1Berakhir && !m1.isAlive()){
           m1Berakhir = true;
           System.out.println("Thread m1 berakhir");
        }
        if(!m2Berakhir && !m2.isAlive()){
           m2Berakhir = true;
           System.out.println("Thread m2 berakhir");
        }
      }while (!m1Berakhir || m2Berakhir);
     
     
   }   
}




Sinkronisasi
-          Pada beberapa kondisi, proses secara bersamaan terkadang tidak memungkinkan
-          Contohnya adalah proses I/O stream khususnya pada proses membaca dan menulis suatu data atau file
-          Proses thread pembacaan atau penulisan data menjadi tidak benar karena seharusnya data dan file tersebut berubah-ubah (sedang dibuka dan ditulis oleh thread lain)
-          Untuk kondisi diatas perlu dilakukan sinkronisasi dengan menggunakan keyword synchronized.
Cara Penggunaan Synchronized:
-          Sinkronisasi pada method : mendeklarasikan suatu method dengan menggunakan keyword synchronized.
-          Sinkronisasi pada objek : menambahkan blok di bawah pada pemmanggilan objek
Synchronized (objek){
. . . .
}


File name : ThreadBeraksi4.java
class Mobil extends Thread{
   public Mobil(String id){
      super(id);
   }
   public void run(){
      String nama = getName();
      SinkronisasiKeluaran.info(nama);
   }
}

class SinkronisasiKeluaran{
   public static synchronized void info(String nama){
      for (int i=0; i<5; i++){
        try{
           Thread.sleep(1000);
        }catch (InterruptedException ie){
           System.out.println("Terinterupsi");
        }
           System.out.println("Thread "+nama+" : posisi"+i);         }
   }
}

public class ThreadBeraksi4 {
   public static void main (String[] args) {
      Mobil m1 = new Mobil("M-1");
      Mobil m2 = new Mobil("M-2");
      m1.start();
      m2.start();
   }   
}

  



File name : ThreadBeraksi5.java
class Mobil extends Thread{
   public Mobil(String id){
      super(id);
   }
   public void run(){
      synchronized (this){
        String nama = getName();
        SinkronisasiKeluaran.info(nama);
      }
   }
}

class SinkronisasiKeluaran{
   public static synchronized void info(String nama){
      for (int i=0; i<5; i++){
        try{
           Thread.sleep(1000);
        }catch (InterruptedException ie){
           System.out.println("Terinterupsi");
        }
           System.out.println("Thread "+nama+" : posisi"+i);         }
   }
}

public class ThreadBeraksi5 {
   public static void main (String[] args) {
      Mobil m1 = new Mobil("M-1");
      Mobil m2 = new Mobil("M-2");
      m1.start();
      m2.start();
   }   
}



Prioritas Thread
-          Method setPriority(int level) dapat dipanggil untuk menentukan prioritas thread
-          Nilai level bisa berupa bilangan bulat dari 1-10
-          Prioritas normal memilki nilai level 5
-          Tidak semua system operasi mendukung operasi ini, sehingga kadang pemanggilan method ini tidak memberikan efek apa-apa.


0 komentar:

Posting Komentar