Blogroll

Kamis, 11 Juni 2015

Tutorial Java: Mengenal Concurrency dengan Multi-Threading

Tutorial Information

ProgramJava
VersionJDK 6+
DifficultyPemula - Standar
Estimated Time40 menit
DownloadClick this link
Berbagai aplikasi yang ada pada komputer dapat menjalankan berbagai proses secara bersamaan. Sebagai contoh sebuah Web Browser dapat menjalakan proses unduh selagi ia membuka halaman beberapa website di tab yang berbeda-beda. Contoh yang lain yaitu Word Processor dimana selagi ia memeriksa ejaan dari kata-kata yang ada, ia masih dapat menerima inputan dari user dan mengupdate tampilan sesuai inputan user. Aplikasi-aplikasi semacam ini biasa disebut Concurrent Software.
Java SE didesain dapat mendukung pembuatan sebuah aplikasi concurrent. Artikel kali ini akan membahas bagaimana membuat sebuah aplikasi concurrent dasar melalui Application Programming Interface (API) milik Java SE yang terdapat dalam java.util.concurrent.
Dalam pemrograman concurrent terdapat dua unit dasar eksekusi yaitu Processes dan Threads. Sebuah komputer pada umumnya memiliki berbagai aktif processes dan threads yang berjalan secara bersamaan. Hal ini tidak terbatas oleh processor yang dimiliki oleh komputer. Multi processing dan Multi-Core Processor memang sangat membantu concurrency namun sebuah prosessor tanpa Multi Core pun tetap dapat menjalankan concurrency. Hal ini dimungkinkan dengan sebuah fitur yang ada pada Sistem Operasi yaitu time slicing.
Threads merupakan bagian dalam sebuah proses. Setiap proses memiliki paling sedikit sebuah thread. Resource yang dimiliki oleh sebuah proses dapat diakses oleh setiap thread yang berada di dalamnya. Pada bahasa pemrograman Java, pemrograman concurrent berfokus pada Threads.
Ide dasar dari pemrograman yang akan anda lakukan adalah membuat sebuah thread, memberhentikan sementara sebuah thread, menginterrupt sebuah thread, dan join pada thread.

Pembuatan Thread

Ada dua cara yang dapat digunakan untuk membuat sebuah thread baru. Yang pertama adalah dengan membuat sebuah objek thread dengan menyertakan sebuah objek yang mengimplementasikan interface Runnable.
?
1
2
3
4
5
6
7
8
9
10
public class RunnableObject implements Runnable {
    @Override
    public void run() {
        System.out.println("Aku ditulis melalui sebuah thread");
    }
 
    public static void main(String[] args) {
        new Thread(new RunnableObject()).start();
    }
}
Yang kedua adalah dengan membuat sebuah objek yang diturunkan dari sebuah class yaitu Thread.
?
1
2
3
4
5
6
7
8
9
10
public class ThreadObject extends Thread{
    @Override
    public void run() {
        System.out.println("Aku ditulis melalui sebuah thread");
    }
 
    public static void main(String[] args) {
        new ThreadObject().start();
    }
}
Perhatikan bahwa untuk menjalankan sebuah thread, method yang anda jalankan adalah start() bukan run(). Ketika anda menjalankan method start() maka method run() akan dijalankan secara otomatis sehingga semua isi dari method run() akan terlaksana. Berikut adalah tampilan yang didapat baik dari cara pertama ataupun kedua.

Pause Thread

Sebuah thread dapat diberhentikan sementara. Salah satu cara yang dapat digunakan adalah dengan menggunakan method sleep() yang dimiliki oleh objek thread. Melalui method ini anda dapat memberhentikan sebuah thread selama selang waktu tertentu.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class PauseThread{
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Aku ditulis");
        System.out.println("(Selang 1 detik)");
        Thread.sleep(1000);
        System.out.println("melalui");
        System.out.println("(Selang 1 detik)");
        Thread.sleep(1000);
        System.out.println("sebuah");
        System.out.println("(Selang 1 detik)");
        Thread.sleep(1000);
        System.out.println("thread");
    }
}
Pada contoh diatas anda tidak perlu membuat sebuah objek thread karena method main sendiri sebenarnya telah menghasilkan sebuah thread. Angka 1000 pada method sleep() berarti bahwa thread akan di pause selama 1000ms (1 detik) sebelum menjalankan perintah selanjutnya. Tampilan yang didapat adalah sebagai berikut.

Interrupt Thread

Interrupt menunjukkan  bahwa sebuah thread harus berhenti melakukan apa yang sedang dikerjakan dan melakukan pekerjaan lainnya. Anda dapat menentukan apa yang akan dikerjakan sebuah thread jika ia di interrupt.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class InterruptedThread extends Thread {
 
    @Override
    public void run() {
        try {
            System.out.println("MyThread dimulai");
            System.out.println("MyThread: silahkan tunggu 5 detik...");
            Thread.sleep(5000);
            System.out.println("MyThread selesai");
        } catch (InterruptedException ex) {
            System.out.println("MyThread diinterrupt!");
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Main thread dimulai");
        Thread myThread = new InterruptedThread();
        myThread.start();
        System.out.println("Main thread: silahkan tunggu 1 detik...");
        Thread.sleep(1000);
        myThread.interrupt();
        System.out.println("Main thread selesai");
    }
}
Pada contoh di atas terdapat 2 thread yaitu main thread dan myThread. Pada main thread myThread dimulai kemudian main thread sendiri berhenti selama 1 detik. Sedangkan myThread sendiri ketika dimulai langsung menulis sebuah pesan lalu berhenti selama 5 detik. Ketika waktu telah berjalan selama 1 detik, main thread menginterrupt myThread yang ternyata sedang dalam proses sleep. Hal ini mengakibatkan myThread mengalami InterruptedException yang kemudian menyebabkan dijalankannya perintah dalam catch statement. Berikut adalah screenshot dari hasil berjalannya program.

Join Thread

Method join() pada objek thread memungkinkan sebuah thread untuk berhenti sementara hingga thread yang ia join telah selesai dieksekusi.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class JoinThread extends Thread{
 
    @Override
    public void run() {
        try {
            System.out.println("MyThread dimulai");
            System.out.println("Silahkan tunggu 5 detik...");
            Thread.sleep(5000);
            System.out.println("MyThread selesai");
        } catch (InterruptedException ex) {
            System.out.println("MyThread di interrupt!");
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Main thread dimulai");
        Thread myThread = new JoinThread();
        myThread.start();
        System.out.println("Main thread joining myThread");
        myThread.join();
        System.out.println("Main thread selesai");
    }
}
Progam dimulai dengan dimulainya main thread diikuti dengan dimulainya myThread, kemudian selagi myThread berjalan main thread melakukan join dengan myThread sehingga ia menunggu hingga myThread selesai dieksekusi. Setelah myThread selesai dieksekusi barulah main thread mengakhiri program. Berikut adalah tampilan yang seharusnya didapat.

Penutup

Dengan mempelajari dasar multi-threading ini, Anda bisa membuat berbagai aplikasi powerful, hingga membuat game dengan Java. Karena concurrency ini merupakan dasar yang penting agar setiap komponen dalam aplikasi bisa berjalan bersamaan, maka bila Anda ingin menjadi programmer Java yang hebat, Anda harus mempelajarinya. Selamat mencoba!

0 komentar:

Posting Komentar