Senin, 06 Agustus 2018

Thread dalam Java

Thread adalah rangkaian eksekusi dari sebuah aplikasi java dan setiap program java minimal memiliki satu buah thread. Sebuah thread bisa berada di salah satu dari 4 status, yaitu new, runnable, blocked, dan dead.





Status Thread
• New, Thread yang berada di status ini adalah objek dari kelas Thread yang baru dibuat, yaitu saat instansiasi objek dengan statement new. Saat thread berada di status new, belum ada sumber daya yang dialokasikan, sehingga thread belum bisa menjalankan perintah apapun.
• Runnable. Agar thread bisa menjalankan tugasnya, method start() dari kelas Thread harus dipanggil. Ada dua hal yang terjadi saat pemanggilan method start(), yaitu alokasi memori untuk thread yang dibuat dan pemanggilan method run(). Saat method run() dipanggil, status thread berubah menjadi runnable, artinya thread tersebut sudah memenuhi syarat untuk dijalankan oleh JVM. Thread yang sedang berjalan juga berada di status runnable.
• Blocked. Sebuah thread dikatakan berstatus blocked atau terhalang jika terjadi blocking statement, misalnya pemanggilan method sleep(). sleep() adalah suatu method yang menerima argumen bertipe integer dalam bentuk milisekon. Argumen tersebut menunjukkan seberapa lama thread akan “tidur”. Selain sleep(), dulunya dikenal method suspend(), tetapi sudah disarankan untuk tidak digunakan lagi karena mengakibatkan terjadinya deadlock. Thread akan menjadi runnable kembali jika interval method sleep()-nya sudah berakhir, atau pemanggilan method resume() jika untuk menghalangi thread tadi digunakan method suspend()
• Dead. Sebuah thread berada di status dead bila telah keluar dari method run(). Hal ini bisa terjadi karena thread tersebut memang telah menyelesaikan pekerjaannya di method run(), maupun karena adanya pembatalan thread. Status jelas dari sebuah thread tidak dapat diketahui, tetapi method isAlive() mengembalikan nilai boolean untuk mengetahui apakah thread tersebut dead atau tidak.



Metode stop(), suspend(), resume()
• Kelas Thread punya metode stop(), suspend() dan resume(). Pada Java 2, metode ini dihapus.
• Berikan nilai null ke suatu variabel Thread untuk meminta thread tersebut berhenti daripada menggunakan metode stop().

Pembentukan Thread dalam java
Untuk membuat thread dalam java terdapat dua cara.
• Extends class Thread
Untuk menjalankan thread, dapat dilakukan dengan memanggil method start(). Saat start() dijalankan, maka sebenarnya method run() dari class akan dijalankan. Jadi untuk membuat thread, harus mendefinisikan method run() pada definisi class.
Konstruktor dari cara ini adalah :
SubThread namaObject = new SubThread();
namaObject.start();
• Implements interface Runnable
Cara ini merupakan cara yang paling sederhana dalam membuat thread. Runnable merupakan unit abstrak, yaitu kelas yang mengimplementasikan interface ini hanya cukup mengimplementasikan fungsi run(). Dalam mengimplementasi fungsi run(), kita akan mendefinisikan instruksi yang membangun sebuah thread. Konstruktor dari cara ini adalah :
MyThread myObject= new MyThread();
Thread namaObject = new Thread(myObject);
Atau dengan cara singkat seperti :
New Thread(new ObjekRunnable());
MyThread merupakan class yang mengimplementasikan interface dari Runnable, dan object dari class MyThread akan menjadi parameter instansi object class Thread.

Synchronized
Sinkronisasi adalah method atau blok yang memiliki tambahan keyword synchronized,sehingga apabila dijalankan maka hanya satu thread pada suatu waktu yang dapat menjalankan method atau blok program. Thread lain akan menunggu thread yang sedang mengeksekusi method ini hingga selesai. Mekanisme sinkronisasi penting apabila terjadi pembagian sumber daya maupun data di antara thread-thread. Sinkronisasi juga melakukan penguncian pada sumber daya atau data yang sedang diproses.
Sinkronisasi dapat dilakukan pada dua bagian yaitu

1. Sinkronisasi Blok
Sintak untuk sinkronisasi blok adalah sebagai berikut :
synchronized (<object reference expression>) {
<code block>
}

2. Sinkronisasi Method
Sintak untuk sinkronisasi method adalah sebagai berikut:
synchronized TypeBalikanMethod NamaMethod ( parameter)
{
}

Prioritas Thread
Dalam Java kita dapat membuat prioritas suatu thread relative terhadapa thread yang lain. Sehingga thread yang mempunyai prioritas lebih tinggi mempunyai kesempatan lebih besar untuk mengakses suatu sources
Java Virtual Machine memilih thread yang runnable dengan prioritas tertinggi. Semua thread java mempunyai prioritas dari 1 sampai 10. Prioritas tertinggi 10 dan berakhir dengan 1 sebagai prioritas terendah. Sedangkan prioritas normal adalah 5.
Thread.MIN_PRIORITY = thread dengan prioritas terendah.
Thread.MAX_PRIORITY = thread dengan prioritas tertinggi.
Thread.NORM_PRIORITY = thread dengan prioritas normal.
Saat thread baru dibuat ia mempunyai prioritas yang sama dengan thread yang menciptakannya. Prioritas thread dapat diubah dengan menggunakan setpriority() method.
setPriority(int priority).

Komunikasi Thread
• Suatu thread dapat melepaskan lock (kunci) sehingga thread lain berkesempatan untuk mengeksekusi metode synchronized.
• Ini karena kelas Object mendefinisikan tiga metode yang memungkinkan thread
berkomunikasi satu dengan lainnnya.
• Metode tersebut adalah wait(), notify() dan notifyall()

Metode Komunikasi Thread
• void wait( ) – mengakibatkan thread tersebut menunggu sampai diberitahu – metode ini hanya dapat dipanggil di dalam metode synchronized.
Bentuk lain dari wait() adalah
– void wait(long msec) throws InterruptedException
– void wait(long msec, int nsec) throws
InterruptedException
• void notify( ) – memberitahukan thread yang terpilih secara acak (random) yang sedang menunggu kunci pada obyek ini – hanya dapat dipanggil di dalam metode synchronized.
• void notifyall( ) – memberitahukan semua thread yang sedang menunggu kunci pada obyek ini - hanya dapat dipanggil di dalam metode synchronized.

Deadlock
• Deadlock adalah error yang dapat diselesaikan dengan multithread.
• Terjadi saat dua atau lebih thread saling menunggu selama tak terbatas untuk melepaskan kunci.
• Misal: thread-1 memegang kunci object-1 dan menunggu kunci dari object-2. Thread-2 memegang
kunci object-2 dan menunggu kunci dari object-1.
• Tidak satu pun thread (ini) dapat diproses. Masing-masing selalu menunggu yang lain untuk melepaskan kunci yang dibutuhkannya.

Kelas Thread
• Kelas Thread bagian dari package java.lang.
• Menggunakan obyek dari kelas ini, thread dapat distop, dipause dan diresume
• Ada banyak constructor & metode pada kelas ini, di antaranya:
1. Thread( String n) – membuat Thread baru dengan nama n.
2. Thread( Runnable target) – membuat obyek Thread baru
3. Thread( Threadgroup group, Runnable target)
Membuat obyek Thread baru dalam Threadgroup.



Cara Pembuatan Thread
Dalam membuat Thread ada dua cara yaitu dengan implements interface Runnable atau dengan extends class Thread.
Berikut ini sedikit contoh dalam membuat Thread dalam Java
Implement Interface Runnable
package threadjavasatu;
/**
*
* @author Taeyeon
*/
public class ThreadRunnable implements Runnable {
Thread runner;
public ThreadRunnable()
{
}
public ThreadRunnable(String threadName)
{
runner = new Thread(this, threadName);
System.out.println(runner.getName());
runner.start();
}
public void run() {
System.out.println(Thread.currentThread());
}
}
nama file main.java
package threadjavasatu;
/**
*
* @author Taeyeon
*/
public class ThreadRunnable implements Runnable {
Thread runner;
public ThreadRunnable()
{
}
public ThreadRunnable(String threadName)
{
runner = new Thread(this, threadName);
System.out.println(runner.getName());
runner.start();
}
public void run() {
System.out.println(Thread.currentThread());
}
}
2. Extends Class Thread
nama file ExThread.java
package threadjavadua;
/**
*
* @author Taeyeon
*/
public class ExThread extends Thread {
public ExThread()
{
}
public ExThread(String threadName)
{
super(threadName);
System.out.println(this);
}
public void run()
{
System.out.println(Thread.currentThread().getName());
}
}
nama file main.java
package threadjavadua;
/**
*
* @author Taeyeon
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Thread threadSatu = new Thread(new ExThread(),”ThreadSatu”);
Thread threadDua = new Thread(new ExThread(),”ThreadDua”);
Thread threadTiga = new Thread();
Thread threadEmpat = new Thread();
Thread threadLima = new ExThread(“thread5”);
threadSatu.start();
threadDua.start();
threadTiga.start();
threadEmpat.start();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread());
}
}

Sinkronisasi
Sinkronisasi merupakan suatu proses untuk mengontrol suatu resource terhadap multiple thread sehingga hanya terdapat satu thread yang mengakses resource tersebut pada satu waktu. Dalam sinkronisasi suatu thread sebelum mengakses suatu resource, harus memperoleh lock. Setelah memperoleh lock, suatu thread dapat mengakses resource tersebut, sedangkan thread lain yang akan menggunakan resource tersebut harus menunggu hingga lock dilepaskan oleh thread yang sedang memegang lock tersebut.
Dalam java terdapat dua jenis synchronized yaitu :
Synchronized method
Synchronized block
Berikut ini contoh Synchronized method
package threadjavaempat;
/**
*
* @author Taeyeon
*/
public class SynchronizedMethod extends Thread {
static String[] msg = { “kukuh”, “utama”, “dan”,”teman”, “teman”};
public SynchronizedMethod(String id)
{
super(id);
}
void randomWait() {
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
System.out.println(“Interrupted!”);
}
}
public synchronized void run() {
SynchronizedOutput.displayList(getName(), msg);
}
}
package threadjavaempat;
/**
*
* @author Taeyeon
*/
public class SynchronizedOutput {
public static synchronized void displayList(String name, String list[]) {
for (int i = 0; i < list.length; i++) {
SynchronizedMethod t = (SynchronizedMethod) Thread.currentThread();
t.randomWait();
System.out.println(name + list[i]);
}
}
}
Nama file Main.java
package threadjavaempat;
/**
*
* @author Taeyeon
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SynchronizedMethod thread1 = new SynchronizedMethod(“thread1: “);
SynchronizedMethod thread2 = new SynchronizedMethod(“thread2: “);
thread1.start();
thread2.start();
boolean t1IsAlive = true;
boolean t2IsAlive = true;
do {
if (t1IsAlive && !thread1.isAlive()) {
t1IsAlive = false;
System.out.println(“t1 is dead.”);
}
if (t2IsAlive && !thread2.isAlive()) {
t2IsAlive = false;
System.out.println(“t2 is dead.”);
}
} while (t1IsAlive || t2IsAlive);
}
}
Dan berikut ini contoh synchronized block
Nama file Counter.java
package threadjavalima;
/**
*
* @author Taeyeon
*/
public class Counter {
long count = 0;
public void add(long value){
synchronized (this) {
this.count += value;
System.out.println(count);
}
}
}
Nama file CounterThread.java
public class CounterThread extends Thread {
protected Counter counter = null;
public CounterThread(Counter counter){
this.counter = counter;
}
public void run() {
for(int i=0; i<10; i++){
counter.add(i);
}
}
}
Nama file Main.java
public class CounterThread extends Thread {
protected Counter counter = null;
public CounterThread(Counter counter){
this.counter = counter;
}
public void run() {
for(int i=0; i<10; i++){
counter.add(i);
}
}
}

Pemberian Nama
Untuk memberi nama pada thread yang kita ciptakan dapat dilakukan dengan beberapa cara.
1. Dengan menggunakan method setName()
2. Dengan menggunakan constructor pada class Thread
Thread(String name) dan Thread( Runnable target, String name)
Walaupun secara default, Java akan memberikan nama pada setiap thread yang dibentuk secara otomatis.
Sedangkan untuk memperoleh nama thread yang sedang running dapat digunakan method getname();
Berikut ini contoh program untuk memberikan dan memperoleh nama thread yang ditelah dibuat.

Nama file ThreadName.java
public class ThreadName extends Thread {
public ThreadName()
{
}
public ThreadName(String nameThread)
{
super(nameThread);
}
public synchronized void  run()
{
System.out.println(“Nama thread adalah:”+ getName());
}
}
Nama file Main.java
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ThreadName threadSatu = new ThreadName(“threadSatu”);
threadSatu.start();
ThreadName threadDua = new ThreadName();
threadDua.setName(“threadDua”);
threadDua.start();
ThreadName threadTiga = new ThreadName();
threadTiga.start();
}
}

3 komentar: