Materi PMBO Bab 1 Kelas XII RPL: Dasar-Dasar Thread

Materi PMBO Bab 1 Kelas XII RPL: Dasar-Dasar Thread


A. Thread dalam Java

Thread merupakan potongan program dengan ukuran kecil (lightweight process) dalam suatu proses yang dapat dijadwalkan oleh sistem operasi. Setiap program Java memiliki setidaknya satu thread, yang dikenal sebagai main thread, yang dibuka oleh Java Virtual Machine (JVM) ketika main method pertama kali dipanggil.

Dengan menggunakan thread, Anda dapat mengeksekusi proses dalam sebuah program tertentu secara paralel. Eksekusi ini dilakukan dengan membagi proses atau operasi tertentu ke beberapa thread. Sistem operasi akan mendeteksi thread-thread tersebut dan membagi waktu pemrosesan untuk masing-masing thread. Oleh karena itu, dengan menggunakan thread, Anda dapat menghemat waktu yang diperlukan untuk melakukan pemrosesan program.



1. Thread Life Cycle 


Terdapat lima tahapan atau state, yaitu sebagai berikut.

A. New

Pada tahap ini, terjadi pembentukan thread menggunakan statement new. Selanjutnya, thread akan berada pada new state. Pada saat tersebut, thread belum aktif sehingga belum dapat menjalankan perintah apa pun.

B. Runnable 

Pada tahap ini, instance threads siap dipanggil menggunakan method start(). Ketika method start() dipanggil, status akan berubah menjadi Runnable. Pada saat tersebut, thread dapat berjalan, tetapi belum dilakukan karena thread scheduler belum dijalankan. Thread scheduler berfungsi sebagai pengatur yang menentukan thread yang akan berjalan ke tahap berikutnya. Ketika suatu thread telah berpindah dari Runnable state, thread tersebut dapat kembali lagi pada tahap ini.

c. Running

Ketika thread scheduler telah menentukan suatu thread untuk berjalan, thread tersebut akan masuk ke running state. Pada tahap ini, method run() akan dieksekusi dan aktif. Setelah thread keluar dari running state, thread akan ke tahap berikutnya. Thread dapat kembali ke Runnable state, masuk ke Waiting state, atau berhenti dan berakhir pada Dead state.

d. Waiting

Suatu thread dapat masuk ke Waiting state karena beberapa alasan, misalnya pemanggilan method wait(). Pemanggilan ini dapat menyebabkan thread tersebut menunggu selesainya thread lain sebelum thread tersebut dapat dijalankan atau tersedianya sumber daya (resource) yang cukup untuk thread tersebut. Setelah alasan tersebut berakhir, thread akan kembali ke Runnable state.

e. Dead

Suatu thread akan memasuki Dead state setelah selesai menjalankan method run(). Thread tersebut akan berhenti dan dinyatakan mati (terhenti). Jika Anda mencoba memanggil method start() pada state ini, Anda akan mendapatkan pesan IllegalThreadStateException, yang disebabkan pemanggilan method dilakukan tidak pada state yang seharusnya.


2. Prioritas Thread

Dalam melakukan pembagian waktu pemrosesan thread (scheduling), Java memiliki priority atau prioritas yang menentukan proses yang akan dijalankan terlebih dahulu. Prioritas thread dalam Java memiliki pembagian nilai prioritas sebagai berikut:
a. MIN_PRIORITY: thread dengan nilai prioritas 1 (rendah).
b. NORM_PRIORITY: thread dengan nilai prioritas 5 (normal), nilai prioritas ini adalah nilai default yang diberikan pada setiap thread di Java.
c. MAX_PRIORITY: thread dengan nilai prioritas 10 (tinggi).

Thread dengan nilai prioritas tinggi berarti thread tersebut sangat penting bagi program. Oleh karena itu, waktu pemrosesan (processor time) untuk thread tersebut, diatur lebih dahulu daripada thread dengan nilai prioritas yang lebih rendah. Akan tetapi, hal ini tidak akan memengaruhi urutan eksekusi thread tersebut dan sangat ditentukan oleh platform yang digunakan.


3. Jenis-jenis Thread

Berdasarkan pembuatannya, thread dalam Java terbagi atas dua jenis, yaitu sebagai berikut.

a. User thread

User thread adalah thread yang dibuat oleh aplikasi atau user dan memiliki nilai prioritas tinggi. Thread ini adalah thread utama yang dijalankan. JVM baru akan dijalankan setelah prosesor selesai mengeksekusi semua user thread.

b. Daemon thread

Daemon thread adalah thread yang sebagian besar dibuat oleh JVM dan memiliki nilai prioritas rendah. Thread ini biasanya digunakan untuk melakukan proses background, seperti garbage collection dan house-keeping. Berbeda dengan user thread, JVM tidak menunggu daemon thread ini selesai melakukan eksekusi. Setelah semua user thread selesai dieksekusi, JVM akan langsung menutup tanpa menunggu semua daemon thread selesai terlebih dahulu.


B. Pembuatan Thread dalam Java


1. Menggunakan Interface Runnable 

Untuk menggunakan teknik ini, selain mengimplementasi interface Runnable, juga perlu dibuat sebuah method run().

Perhatikan kode program berikut ini.
1  class Multix implements Runnable {
2  public void run() { 
3  System.out.println ("thread implements is      running...");
4  }
5
6  public static void main (String args[]) {
7  Multix m1 = new Multix();
8  Thread t1 = new Thread(m1);
9  t1.start();
10 }
11 }

Contoh penulisan kode program di aplikasi JStudio 




Penjelasan kode program tersebut sebagai berikut.

a. Class Multix meng-implement pada interface Runnable.
class Multix implements Runnable 

b. Dibentuk method void run (), untuk menyimpan daftar perintah yang dilakukan. Method ini adalah salah satu method pemicu operasi.

c. Terjadi pembuatan objek baru dengan induk class Multix, serta terjadi pengalihan pemanggilan method dengan menggunakan thread.

public static void main (String args[]) {
     Multix m1 = new Multix ();
     Thread t1 = new Thread (m1);
     t1.start ();
}

Berikut hasil kompilasi kode program tersebut sebagai berikut.



Versi JStudio




2. Menggunakan Turunan Class Thread

Perhatikan kode program berikut ini
1  class Multiz extends Thread {
2  public void run() {
3  System.out.println ("thread extends is              running..." );
4  }
5
6  public static void main (String args[]) {
7  Multiz t1 = new Multiz();
8  t1.start();
9  }
10}

Contoh penulisan kode program tersebut di JStudio





Penjelasan kode program tersebut adalah sebagai berikut.

a. Pada kode program tersebut digunakan perintah extends thread. Terdapat perbedaan dengan teknik sebelumnya, yaitu pada bagian berikut. 

Multiz t1 = new Multiz ();
t1.start ();

b. Pada teknik ini, class Multiz dapat langsung membentuk sebuah objek dan objek tersebut dapat langsung menggunakan fasilitas pada class Multiz, yaitu method run ().

Berikut hasil kompilasi kode program tersebut sebagai berikut.



Versi JStudio 




3. Perbedaan Penggunaan Interface Runnable dan Turunan Class Thread



Secara umum, dapat dikatakan penggunaan interface Runnable merupakan metode yang lebih baik untuk membuat thread di Java karena beberapa keunggulan, seperti dalam hal code reusability dan dapat meng-extend class lain. Namun, pilihan tersebut disesuaikan kembali dengan program atau thread yang akan dikembangkan.


C. Multithreading

Multithreading pada java adalah proses mengeksekusi dua atau lebih thread secara bersamaan untuk pemanfaatan CPU secara maksimal. Dengan menerapkan multithreading, beberapa thread dapat berjalan secara bersamaan tanpa harus mengalokasikan tambahan memori. Dengan demikian, alokasi memori menjadi lebih hemat dan waktu yang dibutuhkan untuk context switching juga lebih singkat.

Perhatikan kode program berikut.
1   public class MultiThread implements               runnable {
2   public static void main (String[] args) {
3   Thread MThread1 = new                                     Thread("Percobaan 1");
4   Thread MThread2 = new                                     Thread("Percobaan 2");
5   Thread MThread3 = new                                     Thread("Percobaan 3");
6   MThread1.start();
7   MThread2.start();
8   MThread3.start();
9   System.out.println("MULTITHREAD                 SEDANG JALAN NIH:");        10System.out.println(MThread1.getName());  11System.out.println(MThread2.getName());
12System.out.println(MThread3.getName()); 13 }
14  
15 public void run() {}
16 }


Contoh penulisan kode program tersebut di JStudio



Penjelasan kode program tersebut adalah sebagai berikut.
1. Class menggunakan thread dengan meng-implement pada interface Runnable.

public class MultiThread implements Runnable 

2. Pembuatan objek baru dengan thread.

Thread MThread1 = new Thread("Percobaan 1");
Thread MThread2 = new Thread("Percobaan 2");
Thread MThread3 = new Thread("Percobaan 3");

3. Perintah untuk menghidupkan thread.

MThread1.start();
MThread2.start();
MThread3.start();

4. Pemanggilan thread. 

System.out.println(MThread1.getName()); System.out.println(MThread2.getName());
System.out.println(MThread3.getName());

5. Pemicu thread.

public void run () {
}


Berikut hasil kompilasi kode program tersebut adalah sebagai berikut.



Versi JStudio




D. Implementasi Multithreading dengan Java Swing


Fungsi thread atau multithread dalam Swing adalah sebagai jalinan penunda atau pengalih eksekusi dalam java. Untuk mengoperasikan thread dengan Swing, diperlukan sebuah form dan tombol yang akan memanggil ActionListener dari thread atau multithread tersebut.

Perhatikan kode program berikut.
1    //STEP 1
2    import java.awt.BorderLayout;
3    import java.awt.Container;
4    import java.awt.FlowLayout;
5    import java.awt.event.ActionEvent;
6    import java.awt.event.ActionListener;
7
8    import javax.swing.JButton;
9    import javax.swing.JFrame;
10  import javax.swing.JLabel;
11  import javax.swing.JPanel;
12  import javax.swing.SwingUtilities;
13
14  //STEP 2  
15  public class RevInvoke {
16  private static JButton good = new JButton("THREAD 1");
17  private static JButton bad2 = new JButton("THREAD 2");
18  private static JLabel resultLabel = new JLabel("THREAD 
19  SIAP DICOBA");
20  JLabel.CENTER);
21
22  //STEP 3    
23  public static void main(String[] args) {
24  JFrame f = new JFrame();
25f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
26        
27  //Membuat Layout 
28  JPanel p = new JPanel();
29  p.setOpaque(true);
30  p.setLayout(new FlowLayout());
31  p.add(good);
32  p.add(bad2);
33        
34  Container c = f.getContentPane();
35  c.setLayout(new BorderLayout());
36  c.add(p, BorderLayout.CENTER);
37  c.add(resultLabel, BorderLayout.SOUTH);
38
39  //STEP 4
40  //Membuat ActionListeners Button THREAD 1     
41  good.addActionListener(new ActionListener() {
42  public void actionPerformed(ActionEvent ev) {
43  resultLabel.setText("Thread 1 sedang berjalan . . .");
44  setEnabled(false);
45                
46  Thread worker = new Thread() {
47  public void run() {
48  try {
49  Thread.sleep(5000);
50  } catch (InterruptedException ex) {}
51                        
52  //Report Hasil                      53SwingUtilities.invokeLater(new Runnable() {
54  public void run() {
55  resultLabel.setText("THREAD 1 BERHENTI");
56  setEnabled(true);
57  }
58  });
59  }
60  };
61               
62  worker.start();
63  }
64  });
65        
66  //STEP 5
67  //Membuat ActionListeners Button THREAD 2
68  bad2.addActionListener(new ActionListener() {
69  public void actionPerformed(ActionEvent ev) {
70  resultLabel.setText("Thread 2 sedang berjalan . . .");
71  setEnabled(false);
72               
73  SwingUtilities.invokeLater(new Runnable() {
74  public void run() {
75  try {
76  Thread.sleep(5000);
77  } catch (InterruptedException ex) {}
78                       
79  resultLabel.setText("THREAD 2 BERHENTI ");
80  setEnabled(true);
81  }
82  });
83  }
84  });
85       
86  f.setSize(300, 100);
87  f.setVisible(true);
88  }
89    
90  //Allows up to turn the buttons on or off while we work.
91  static void setEnabled(boolean b) {
92  good.setEnabled(b);
93  bad2.setEnabled(b);
94  }
95  }


Contoh penulisan kode program tersebut di JStudio




Penjelasan kode program tersebut adalah sebagai berikut.
1. Pada STEP 1, dilakukan import library Java yang akan digunakan untuk membentuk frame dan tombol.

2. Pada STEP 2, dilakukan proses pembentukan frame dan button.

3. Pada STEP 3, dilakukan layout frame, tombol, serta ActionListener pada setiap tombol. Pada bagian inilah, inti operasi thread dibentuk dan ActionListener akan dipanggil melalui objek tombol.

4. Pada STEP 4 dan STEP 5, dilakukan pemanggilan method ActionListener.

Berikut hasil kompilasi kode program tersebut adalah sebagai berikut.



Versi JStudio 


Kemungkinan alasan hasil kompilasi di JStudio mengalami error mungkin karena JStudio belum 100% support library pada Java.