Anda di halaman 1dari 30

Page |1

BAB I PENDAHULUAN

1.1. Latar Belakang Java adalah bahasa pemrograman banyak thread, yang artinya beberapa hal bisa dilakukan bersama-sama. Thread adalah unit terkecil dari eksekusi suatu program. Thread mengeksekusi rangkaian instruksi satu demi satu. Ketika sistem menjalankan program, komputer akan membuat thread baru. (Thread dalam konteks ini disebut proses, akan tetapi perbedaanya tidank penting di sini). Instruksi-instruksi dalam program akan dieksekusi oleh thread ini secara berantai, satu demi satu dari awal hingga akhir. Thread disebut "mati" jika program selesai dieksekusi. Dalam sistem komputer modern, beberapa thread bisa tercipta dalam satu waktu. Pada satu saat tertentu, hanya ada satu thread yang bisa dijalankan, karena CPU hanya bisa melakukan satu hal dalam satu waktu. (Pada komputer dengan multiprosesor, multicore, dan hyper-threading, masing-masing prosesor atau core melakukan thread yang berbeda-beda). Akan tetapi sebenarnya komputer membagi waktu menjadi bagian-bagian kecil sehingga seolah-olah seluruh thread dijalankan secara bersama-sama. Pembagian waktu berarti CPU mengeksekusi suatu thread dalam kurun waktu tertentu, setelah itu beralih mengeksekusi thread yang lain, kemudian thread lain, dan seterusnya dan kemudian kembali ke thread pertama -kira-kira 100 kali per detik. Di mata user, semua thread berjalan pada saat yang sama. Java bisa membuat satu atau lebih thread yang bisa dijalankan secara paralel. Hal ini adalah bagian mendasar, yang dibuat di dalam core bahasa, bukan merupakan tambahan (add-on) seperti bahasa pemrograman lain. Tetap saja pemrogaman dengan banyak thread adalah sesuatu yang tidak mudah. Penggunaan thread yang banyak digunakan untuk membuat GUI (Graphical User Interface) yang responsif. Pada dasarnya suatu program

Page |2

harus dapat terus bejalan dan pada saat yang sama tetap bisa menerima input dari user, menanggapi klik mouse, dan sebagainya. Thread juga digunakan untuk mempercepat suatu proses, misalnya kita ingin membuat program yang menunggu suatu input I/O dari network, dan pada saat yang sama mengolahnya sehingga proses pengolahan berjalan serentak. Jika program harus menunggu seluruh input datang baru kemudian melakukan pengolahan, tentunya akan memakan waktu yang lebih lama, terutama apabila aliran network lambat atau pengolahannya memakan waktu lama.

Page |3

BAB II PEMBAHASAN

2.1. Pengertian Thread Thread adalah sebuah alur kontrol dari sebuah proses. Kontrol single thread hanya memungkinkan proses untuk menjalankan satu tugas pada satu waktu. Banyak sistem operasi modern telah memiliki konsep yang dikembangkan agar memungkinkan sebuah proses untuk memiliki eksekusi multi-threads, agar dapat secara terus menerus mengetik dan menjalankan pemeriksaan ejaan didalam proses yang sama, maka sistem operasi tersebut memungkinkan proses untuk menjalankan lebih dari satu tugas pada satu waktu. Suatu proses yang multithreaded mengandung beberapa perbedaan alur kontrol dengan ruang alamat yang sama. Keuntungan dari multithreaded meliputi peningkatan respon dari user, pembagian sumber daya proses, ekonomis, dan kemampuan untuk mengambil keuntungan dari arsitektur multiprosesor. Thread merupakan unit dasar dari useran CPU, yang terdiri dari Thread_ID, program counter , register set, dan stack. Sebuah thread berbagi code section, data section, dan sumber daya sistem operasi dengan thread lain yang dimiliki oleh proses yang sama. Thread juga sering disebut lightweight process.

2.2. Jenis-Jenis Proses Thread Pada proses thread terdapat dua jenis thread, yaitu: 1. Single Thread Process Sebuah proses tradisional atau heavyweight process mempunyai single thread yang berfungsi sebagai pengendali. Dapat diartikan sebagai proses yang bekerja secara berurutan sesuai dengan urutan masing-masing thread (terstruktur) dan hanya mengerjakan satu tugas dalam satu waktu. Di bawah ini merupakan gambar single thread.
3

Page |4

Gambar 2.1. Single Thread

Contoh program dari single thread adalah sebagai berikut:


//program ke sembilanbelas //single thread public class racesingle{ public static void main(String args[]){ raceTest horse1 = new raceTest(); raceTest horse2 = new raceTest(); raceTest horse3 = new raceTest(); System.out.println("\nRace Starting ....\n"); System.out.println("Race started!\n\n"); horse1.run("horse1"); horse2.run("horse2"); horse3.run("horse3"); } } class raceTest{ private int pause; private int stage=0; public void run(String name){ try{ System.out.println(name + " started!"); do{ System.out.println( " - stage: " + (stage+1)

Page |5

); pause = (int) (Math.random() * 1000); stage++; } while (stage<5); } catch(Exception exception){ System.out.println(exception.toString()); } System.out.println(name + " finished!"); } }

Program ke-sembilanbelas menggunakan single thread, dimana setelah horse1 telah selesai di proses maka horse2 diproses, kemudian horse3 diproses. Hasil program:
Race Starting .... Race started! horse1 started! - stage: 1 - stage: 2 - stage: 3 - stage: 4 - stage: 5 horse1 finished! horse2 started! - stage: 1 - stage: 2 - stage: 3 - stage: 4 - stage: 5 horse2 finished! horse3 started! - stage: 1 - stage: 2 - stage: 3 - stage: 4 - stage: 5 horse3 finished! Finished executing

Page |6

2. Multithread Process Merupakan satu atau beberapa thread yang dijalankan secara bersamaan (multiproses), dimana masing-masing thread tersebut dijalankan pada jalur masing-masing. Setiap thread pada multithread menjalankan kode atau script program secara berurutan. Multithread dapat diartikan juga sebagai suatu proses dengan thread banyak dapat mengerjakan lebih dari satu tugas pada satu satuan waktu. Multithread sering pula disebut dengan multiproses atau

multitasking pada sistem operasi. Gambar multithread ditunjukkan pada gambar 2.2.

Gambar 2.2. Multitread

Banyak perangkat lunak yang berjalan pada PC modern dirancang secara multithreading. Sebuah aplikasi biasanya diimplementasi sebagai proses yang terpisah dengan beberapa thread yang berfungsi sebagai pengendali. Contohnya sebuah web browser mempunyai thread untuk

menampilkan gambar atau tulisan sedangkan thread yang lain berfungsi sebagai penerima data dari network. Kadang kala ada situasi dimana sebuah aplikasi diperlukan untuk menjalankan beberapa tugas yang serupa. Sebagai contohnya sebuah web

Page |7

server dapat mempunyai ratusan klien yang mengaksesnya secara concurrent. Kalau web server berjalan sebagai proses yang hanya mempunyai single thread maka ia hanya dapat melayani satu klien pada pada satu satuan waktu. Bila ada harus menunggu klien lain sampai yang ingin mengajukan permintaan maka ia

klien sebelumnya selesai dilayani. Solusinya

adalah dengan membuat web server menjadi multithreading. Dengan ini maka sebuah web server akan membuat thread yang akan mendengar permintaan klien, ketika permintaan lain diajukan maka web server akan menciptakan thread lain yang akan melayani permintaan tersebut. Contoh program dari mutithread dari pengembangan program single thread (program ke-sembilanbelas)
//program keduapuluh //multithread public class race{ public static void main(String args[]){ raceThread horse1 = new raceThread("horse1"); raceThread horse2 = new raceThread("horse2"); raceThread horse3 = new raceThread("horse3"); System.out.println("\nRace Starting ....\n"); // Mulai Thread horse1.start(); horse2.start(); horse3.start(); System.out.println("Race started!\n\n"); } } class raceThread extends Thread{ private int pause; private int stage=0; public raceThread(String name){ super(name); } public void run(){ try{ do { System.out.println( this.getName() + " - stage: " + (stage+1) );

Page |8

pause = (int) (Math.random() * 1000); Thread.sleep(pause); stage++; } while (stage<5); } catch(InterruptedException exception){ System.out.println(exception.toString()); } System.out.println(getName() + " finished!"); } }

Program di atas menggunakan multithread yang berarti modul horse1 diproses, kemudian tanpa harus menunggu horse1 selesai diproses, maka horse2 dapat diproses, begitu pula horse3, sudah dapat diproses tanpa harus menunggu horse1 dan horse2 selesai. Hasil program :
Race Starting .... horse1 - stage: 1 horse2 - stage: 1 Race started! horse3 - stage: 1 horse1 - stage: 2 horse1 - stage: 3 horse3 - stage: 2 horse2 - stage: 2 horse3 - stage: 3 horse1 - stage: 4 horse2 - stage: 3 horse1 - stage: 5 horse3 - stage: 4 horse3 - stage: 5 horse1 finished! horse3 finished! horse2 - stage: 4 horse2 - stage: 5 horse2 finished!

2.3. Keuntungan Thread Terdapat empat keuntungan utama dari program yang multithreading, yaitu sebagai berikut:

Page |9

1. Responsiveness Membuat aplikasi yang interaktif menjadi multithreading dapat

membuat sebuah program terus berjalan meski pun sebagian dari program tersebut diblok atau melakukan operasi yang panjang, karena itu dapat meningkatkan respons kepada user. Sebagai contohnya dalam web browser yang multithreading, sebuah thread dapat melayani permintaan user sementara thread lain berusaha menampilkan image. 2. Resource sharing Thread berbagi memori dan sumber daya dengan thread lain yang dimiliki oleh proses yang sama. Keuntungan dari berbagi kode adalah mengizinkan sebuah aplikasi untuk mempunyai beberapa thread yang berbeda dalam lokasi memori yang sama. 3. Economy Dalam pembuatan sebuah proses banyak dibutuhkan pengalokasian memori dan sumber daya. Alternatifnya adalah dengan useran thread,

karena thread berbagi memori dan sumber daya proses yang memilikinya maka akan lebih ekonomis untuk membuat dan context switch thread. Akan sulit untuk mengukur perbedaan waktu antara proses

dan thread dalam hal pembuatan dan pengaturan, tetapi secara umum pembuatan dan pengaturan proses lebih lama dibandingkan thread. Pada Solaris, pembuatan proses lebih lama 30 kali dibandingkan pembuatan thread, dan context switch proses 5 kali lebih lama dibandingkan context switch thread. 4. Utilization of multiprocessor architectures Keuntungan dari multithreading dapat sangat meningkat pada arsitektur multiprocessor, dimana setiap thread dapat berjalan secara pararel di atas processor yang berbeda. Pada arsitektur processor tunggal, CPU menjalankan setiap thread secara bergantian tetapi hal ini berlangsung sangat cepat sehingga menciptakan ilusi pararel, tetapi pada

kenyataannya hanya satu thread yang dijalankan CPU pada satu-satuan waktu (satu-satuan waktu pada CPU biasa disebut time slice atau quantum).

P a g e | 10

2.4. Model Multithread a. Berdasarkan Thread Support Sistem operasi telah mendukung proses multithreading. Setiap sistem operasi memiliki konsep tersendiri dalam

pengimplementasiannya. Sistem operasi dapat mendukung thread pada tingkatan kernel maupun tingkatan user. Ada dua macam model support multithread, yaitu: 1) Thread User (User Thread) Thread yang didukung oleh kernel dimana pengaturannya dilakukan oleh pustaka thread pada tingkatan user. Karena pustaka yang menyediakan fasilitas untuk pembuatan dan penjadwalan thread, thread user cepat dibuat dan dikendalikan. 2) Thread Kernel Thread yang didukung langsung oleh kernel (sistem operasi). Pembuatan, penjadwalan dan manajemen thread dilakukan oleh kernel pada kernel space. Karena dilakukan oleh sistem operasi, proses pembuatannya akan lebih lambat jika dibandingkan dengan user thread. b. Berdasarkan Pemetaan Thread Model multithreading berdasarkan dengan pemetaan dibedakan menjadi tiga bagian, yaitu: 1) Many to One Model ini memetakan beberapa thread tingkatan user ke thread tingkatan kernel. Pengaturan thread sebuah

dilakukan dalam

ruang user sehingga efisien. Hanya satu thread user yang dapat mengakses thread kernel pada satu saat. Jadi Multiple thread tidak dapat berjalan secara paralel pada multiprosesor. Contoh dari many to one adalah Solaris Green Threads dan GNU Portable Threads. Model Many to One ditunjukkan pada gambar 2.3.

P a g e | 11

Gambar 2.3. Many to One

2) One to One Model ini memetakan setiap thread tingkatan user ke setiap thread. One to One menyediakan lebih banyak concurrency dibandingkan model Many to One. Keuntungannya sama dengan keuntungan thread kernel. Kelemahan model ini ialah setiap pembuatan thread user memerlukan tambahan thread kernel. Karena itu, jika mengimplementasikan sistem ini maka akan menurunkan kinerja dari sebuah aplikasi sehingga biasanya jumlah thread dibatasi dalam sistem. Adapun contoh dari one to one, yaitu Windows NT/XP/2000, Linux, Solaris 9. Gambar 2.4. menunjukkan model One to One.

Gambar 2.4. One to One

P a g e | 12

3) Many to Many Model ini memultipleks banyak thread tingkatan user ke thread kernel yang jumlahnya sedikit atau sama dengan tingkatan user. Model ini mengizinkan developer membuat thread sebanyak yang developer inginkan tetapi concurrency tidak dapat diperoleh karena hanya satu thread yang dapat dijadwalkan oleh kernel pada suatu waktu. Keuntungan dari sistem ini ialah kernel thread yang bersangkutan dapat berjalan secara paralel pada multiprosessor. Model Many to Many ditunjukkan pada gambar dibawah ini.

Gambar 2.5. Many to Many

2.5. Status Thread Suatu thread dapat berada dalam salah satu status seperti berikut ini: 1. New Thread yang berada pada status ini merupakan objek dari kelas Thread yang baru dibuat, yaitu saat instansiasi objek dengan statement new. Pada saat thread berada pada status new, belum ada sumber daya yang dialokasikan, sehingga thread belum bisa menjalankan perintah apapun. Menjalankan thread Method start() dari kelas Thread harus dipanggil, agar thread bisa menjalankan tugasnya. Ada dua hal yang terjadi pada saat

P a g e | 13

pemanggilan method start(), yaitu alokasi memori untuk dibuat dan pemanggilan method run(). 2. Runnable Pada saat method run() dipanggil, maka status thread berubah menjadi runnable, artinya thread tersebut sudah memenuhi syarat untuk dijalankan oleh Java Virtual Machine (JVM). Thread yang sedang berjalan juga dikategorikan dalam status runnable. Blocking statement dan interupsi I/O Yaitu kondisi yang menghalangi pengeksekusian thread. Ada beberapa jenis blocking statement, seperti pemanggilan method
sleep(), suatu method yang menerima argumen bertipe integer

dalam bentuk milisekon. Argumen tersebut menunjukkan berapa lama thread akan tidur. Selain sleep() dulunya dikenal method
suspend(), tetapi sudah disarankan untuk tidak diguankan lagi

karena mengakibatkan terjadinya deadlock. Disamping adanya blocking statement, adanya interupsi I/O juga dapat menyebabkan thread menjadi blocked. 3. Blocked Status blocking menunjukkan bahwa sebuah thread terhalang untuk menjalankan tugasnya, sehingga dapat dikatakan thread tersebut terhenti untuk sementara. Thread akan menjadi runnable kembali jika interval method sleep()-nya telah berakhir, atau pemanggilan method resume() untuk mengakhiri method suspend() atau karena I/O sudah tersedia lagi. Keluar dari method run() Hal ini bisa terjadi karena thread tersebut memang telah menyelesaikan pekerjaannya di method run(), maupun karena adanya pembatalan thread. 4. Dead Setelah keluar dari method run(), thread akan berada dalam status dead dan menjadi tidak aktif lagi. Status jelas dari thread tidak dapat

P a g e | 14

diketahui, tetapi method isAlive() mengembalikan nilai boolean untuk mengetahui apakah thread tersebut dead atau tidak. Gambar 2.6. merupakan ringkasan dari status thread.

Gambar 2.6. Status Thread

2.6. Class Thread Ada tiga macam class Thread, yaitu: a. Constructor Thread() Membuat sebuah object Thread yang baru. Thread(String name) Membuat sebuah object Thread dengan memberikan penamaan yang spesifik. Thread(Runnable target) Membuat sebuah object Thread yang baru berdasar pada object Runnable. Target menyatakan sebuah object diaman method run() dipanggil Thread(Runnable target, String name) Membuat sebuauh object Thread yang baru dengan nama yang spesifik dan berdasarkan pada object Runnable.

P a g e | 15

b.

Contants public final static int MIN_PRIORITY Nilai prioritas minimum, 0 public final static int NORM_PRIORITY Nilai default prioritas, 5 public final static int MAX_PRIORITY Nilai prioritas maksimum, 10

c.

Method public static Thread currentThread() Mengembalikan sebuah reference kepada thread yang sedang berjalan. public final String getName() Mengembalikan nama thread. public final void setName(String name) Mengulang pemberian nama thread sesuai dengan argument name. Hal ini menyebabkan SecurityException. public final int getPriority() Mengembalikan nilai prioritas yang telah diberikan kepada thread tersebut. public final boolean isAlive() Menunjukkan bahwa thread tersebut sedang berjalan atau tidak. public final void sleep (long milis) Menunda thread dalam jangka waktu milis. Hal ini dapat menyebabkan InterruptedException. Public void run() Eksekusi thread dimulai dari method ini. Public void start() Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run().

P a g e | 16

2.7. Prioritas Thread Untuk menentukan thread mana yang akan menerima control dari CPU dan akan dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas. Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10, dimana semakin tinggi prioritas dari sebuah thread, berarti semakin besar kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu. Sebagai contoh, asumsikan bahwa ada dua buah thread yang berjalan bersama-sama. Thread pertama akan diberikan prioritas nomor 5,

sedangkan thread yang kedua memiliki prioritas 10. Anggap bahwa thread pertama telah berjalan pada saat thread kedua dijalankan. Thread kedua akan menerima control dari CPU dan akan dieksekusi pada saat thread kedua tersebut memiliki prioritas yang lebih tinggi dibandingkan thread yang pada saat itu tengah berjalan. Salah satu contoh dari skenario ini adalah context switch. Sebuah context switch terjadi apabila sebagian dari thread telah dikontrol oleh CPU dari thread yang lain. Ada beberapa skenario mengenai bagaimana cara kerja dari context switch. Salah satu skenario adalah sebuah thread yang sedang berjalan memberikan kesempatan kepada CPU untuk mengontrol thread lain sehingga ia dapat berjalan. Dalam kasus ini, prioritas tertinggi dari thread adalah thread yang siap untuk menerima kontrol dari CPU. Cara yang lain dari context switch adalah pada saat sebuah thread yang sedang

berjalan diambil alih oleh thread yang memiliki prioritas tertinggi seperti yang telah dicontohkan sebelumnya. Hal ini juga mungkin dilakukan apabila lebih dari satu CPU tersedia, sehingga lebih dari satu prioritas thread yang siap untuk dijalankan. Untuk menentukan diantara dua thread yang memiliki prioritas sama untuk menerima kontrol dari CPU, sangat bergantung kepada sistem operasi yang digunakan. Windows 95/98/NT menggunakan time-slicing dan roundrobin untuk menangani kasus ini. Setiap thread dengan prioritas yang sama akan diberikan sebuah jangka waktu tertentu untuk dieksekusi sebelum CPU mengontrol thread lain yang memiliki prioritas yang sama.

P a g e | 17

Sedangkan Solaris, ia akan membiarkan sebuah thread untuk dieksekusi sampai thread tersebut menyelesaikan tugasnya atau sampai secara suka rela membiarkan CPU untuk mengontrol thread yang lain. Contoh program prioritas dengan menggunakan variable system MIN_PRIORITY = 1; NORM_PRIORITY = 5; MAX_PRIORITY = 10, sebagai berikut:
//program ke duapuluhsatu //programpriority class A extends Thread{ public void run(){ System.out.println("Thread A started" ); for(int i=1;i<=4;i++){ System.out.println("\t From ThreadA: i= "+i); } System.out.println("Exit from A"); } } class B extends Thread{ public void run(){ System.out.println("Thread B started"); for(int j=1;j<=4;j++){ System.out.println("\t From ThreadB: j= "+j); } System.out.println("Exit from B"); } } class C extends Thread{ public void run(){ System.out.println("Thread C started"); for(int k=1;k<=4;k++){ System.out.println("\t From ThreadC: k= "+k); } System.out.println("Exit from C"); } } class ThreadPriority{ public static void main(String args[]){ A threadA=new A(); B threadB=new B();

P a g e | 18

C threadC=new C(); threadA.setPriority(Thread.NORM_PRIORITY); threadB.setPriority(Thread.MIN_PRIORITY); threadC.setPriority(Thread.MAX_PRIORITY); threadA.start(); threadB.start(); threadC.start(); System.out.println("End of main thread"); } }

2.8. Pembuatan Thread Sebuah thread dapat diciptakan dengan cara menurunkan (extend) class Thread atau dengan mengimplementasikan sebuah interface Runnable. a. Extend class Thread Kelas Thread secara implisit juga meng-implements Runnable. Oleh karena itu, setiap kelas yang diturunkan dari kelas Thread juga harus mendefinisikan method run(). Contoh Extend class Thread Multithread diimplementasikan sebagai objek dimana objek tersebut mempunyai Method run()
class MyThread extends Thread{ public void run() { // thread body of execution } }

Membuat thread:
MyThread thr1 = new MyThread();

Menjalankan thread:
thr1.start();

Atau Membuat Thread Kemudian Dijalankan


new MyThread().start();

P a g e | 19

b.

Implementasi interface Runnable Cara lain untuk membuat sendiri sebuah thread adalah dengan mengimplementasikan interface Runnable. Hanya satu method yang dibutuhkan oleh interface Runnable yaitu method run(). Contoh Implmentasi interface Runnable Struktur
class MyThread implements Runnable{ ..... public void run(){ // thread body of execution } }

Membuat Objek
MyThread myObject = new MyThread();

Membuat Thread Object:


thread thr1 = new Thread( myObject );

Cara menjalankan
thr1.start();

Dari dua cara untuk menciptakan thread seperti diatas, memilih salah satu dari kedua cara tersebut bukan sebuah permasalahan. Implement sebuah interface Runnable menyebabkan lebih banyak pekerjaan yang harus dilakukan karena kita harus mendeklarasikan sebuah object Thread dan memanggil method Thread dari object tersebut. Sedangkan menurunkan (extend) sebuah class Thread, bagaimanapun menyebabkan class tersebut tidak dapat menjadi turunan dari class yang lainnya karena Java tidak memperbolehkan adanya multiple inheritance. . 2.9. Pustaka Thread (Library Thread) Pustaka thread atau yang lebih familiar dikenal dengan thread

library bertugas untuk menyediakan API untuk programmer dalam menciptakan dan mengelola thread. Ada dua cara dalam

mengimplementasikan pustaka thread, yaitu: a. Menyediakan API dalam level pengguna tanpa dukungan dari kernel sehingga pemanggilan fungsi tidak melalui system call. Jadi, jika

P a g e | 20

memanggil fungsi yang sudah ada di pustaka, maka akan menghasilkan pemanggilan fungsi call yang sifatnya lokal dan bukan system call. b. Menyediakan API di level kernel yang didukung secara langsung oleh sistem operasi. Pemanggilan fungsi call akan melibatkan system call ke kernel. Ada tiga pustaka thread yang sering digunakan saat ini, yaitu: POSIX Pthreads, Java, dan Win32. Implementasi POSIX standard dapat dengan cara user level dan kernel level, sedangkan Win32 adalah kernel level. Java API thread dapat diimplementasikan oleh Pthreads atau Win32.

2.10.

Pembatalan Thread (Thread Cancellation) Thread Cancellation ialah pembatalan thread sebelum tugasnya program Java hendak mematikan

selesai. Umpamanya, jika dalam Java

Virtual Machine (JVM). Sebelum JVM dimatikan, maka seluruh

thread yang berjalan harus dibatalkan terlebih dahulu. Contoh lain adalah di masalah search. Apabila sebuah thread mencari sesuatu dalam database dan menemukan serta mengembalikan hasilnya, thread sisanya akan dibatalkan. Thread yang akan diberhentikan biasa disebut target thread. Pemberhentian target thread dapat dilakukan dengan 2 cara, yaitu: a. Asynchronous cancellation. Suatu thread seketika itu juga membatalkan target thread. b. Deferred cancellation. Suatu thread secara periodik memeriksa apakah thread harus batal, cara ini memperbolehkan target thread untuk membatalkan dirinya secara terurut. Hal yang sulit dari pembatalan thread ini adalah ketika terjadi situasi dimana sumber daya sudah dialokasikan untuk thread yang akan dibatalkan. Selain itu kesulitan lain adalah ketika thread yang dibatalkan sedang mengupdate data yang ia bagi dengan thread lain. Hal ini akan menjadi masalah yang sulit apabila digunakan asynchronous cancellation. Sistem operasi akan mengambil kembali sumber daya dari thread yang dibatalkan tetapi

P a g e | 21

seringkali sistem operasi tidak mengambil kembali semua sumber daya dari thread yang dibatalkan. Alternatifnya adalah dengan menggunakan deffered cancellation. Cara kerja dari deffered cancellation adalah dengan menggunakan satu thread yang berfungsi sebagai pengindikasi bahwa target thread akan dibatalkan. Tetapi pembatalan hanya akan terjadi jika target thread memeriksa apakah thread harus batal atau tidak. Hal ini memperbolehkan thread untuk memeriksa apakah thread harus batal pada waktu dimana thread dapat dibatalkan secara aman yang aman. Pthread merujuk sebagai cancellation points. Pada umumnya sistem operasi memperbolehkan proses atau thread untuk dibatalkan secara asynchronous. Tetapi Pthread API menyediakan deferred cancellation. Hal ini berarti sistem operasi yang

mengimplementasikan Pthread API akan mengizinkan deferred cancellation.

2.11.

Penjadwalan Thread Thread baru dapat dijalankan dengan berbagai macam penjadwalan

pada saat baru dibuat. Kebijakan penjadwalan yang menentukan setiap proses, di mana proses tersebut akan ditaruh dalam daftar proses sesuai proritasnya dan bagaimana thread bergerak dalam daftar proses tersebut. Untuk menjadwalkan thread, sistem dengan model mulithreading many to many atau many to one menggunakan: a. Process Contention Scope (PCS). Pustaka thread menjadwalkan thread pengguna untuk berjalan pada LWP (lightweight process) yang tersedia. b. System Contention Scope (SCS). SCS berfungsi untuk memilih satu dari banyak thread, kemudian menjadwalkannya ke satu thread tertentu (CPU/Kernel).

2.12.

Sinkronisasi Thread yang berjalan bersama-sama tetapi tidak bergantung satu

dengan yang lainnya. Thread tersebut adalah thread yang berjalan sendiri tanpa memperhatikan status dan aktifitas dari thread lain yang sedang

P a g e | 22

berjalan. Pada hal tersebut, setiap thread tidak membutuhkan resource atau method dari luar sehingga tidak membutuhkan komunikasi dengan thread lain. Didalam situasi-situasi tertentu, sebuah thread yang berjalan

bersama-sama kadang membutuhkan resource atau method dari luar. Oleh karena itu, thread tersebut perlu untuk berkomunikasi satu dengan yang lain sehingga dapat mengetahui status dan aktifitas mereka. Contoh program yang tidak disinkronisasi, yaitu sebuah kode sederhana yang mencetak sebuah string dengan urutan tertentu.
class TwoStrings { static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); } } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); } }

P a g e | 23

Program

tersebut diharapkan

dapat

mencetak

dua

argument

object Runnable secara berurutan. Permasalahannya adalah, pendeklarasian method sleep() akan menyebabkan thread walaupun thread yang pertama belum yang lain akan dieksekusi

selesai dijalankan pada saat

eksekusi method print() dari class TwoStrings. Hasil keluaran contoh program di atas adalah .
Hello How are Thank you there. you? very much!

Pada saat berjalan, ketiga thread telah mencetak argument string pertama mereka sebelum argument kedua dicetak. Sehingga hasilnya adalah sebuah keluaran yang tidak jelas. Contoh program diatas, tidak menunjukkan permasalahan yang serius. Akan tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahan-permasalahan tertentu. Berikut ini adalah contoh program yang telah disinkronisasi dari sebuah objek yang bernama account digunakan oleh beberapa objek, yaitu

MyThread, YourThread, dan HerThread, terlihat pada gambar 2.7.

Gambar 2.7. Shared Object

Didalam objek account tersebut ada nilai yang diubah oleh ketiga objek yang mengakses objek account. MyThread menambah nilai 1 sebanyak 10 kali dengan pemanggilan objek sebanyak 5 kali pada variabel balance di dalam objek account.

P a g e | 24

YourThread mengurangi nilai 1 sebanyak 10 kali pada variable balance didalam objek account dengan pemanggilan objek sebanyak 5 kali. Dan HerThread hanya menampilkan nilai variable balance sebanyak 10 kali didalam objek. Dengan kata lain balance = 0 + (1 X 10 X 5) (1 X 10 X 5), hasilnya adalah 0. Apabila objek tersebut tidak menggunakan synchronized, maka akan terjadi inconsistent state sehingga nilai tersebut belum tentu menghasilkan nilai 0.
//program ke duapuluh dua class InternetBankingSystem { public static void main(String [] args Account accountObject = new Account (); Thread t1 = new Thread(new MyThread(accountObject)); Thread t2 = new Thread( new YourThread(accountObject) ); Thread t3 = new Thread(new HerThread(accountObject)); t1.start(); t2.start(); t3.start(); } } class MyThread implements Runnable Account account; private int pause; private int i = 0; public MyThread (Account s) { public void run() { try { do { account.deposit(); pause = (int) (Math.random() * 10); Thread.sleep(pause); i++; } while (i<5); }catch(InterruptedException exception){ System.out.println(exception.toString()); } } } class YourThread implements Runnable { account = s;} { ) {

P a g e | 25

Account account; private int pause; private int i = 0; public YourThread (Account s) { account = s;} public void run() { try { do { account.withdraw(); pause = (int) (Math.random() * 10); Thread.sleep(pause); i++; } while (i<5); }catch(InterruptedException exception){ System.out.println(exception.toString()); } } } class HerThread implements Runnable Account account; private int pause; private int i = 0; public HerThread (Account s) { account = s; } public void run() { try { do { account.enquire(); pause = (int) (Math.random() * 10); Thread.sleep(pause); i++; } while(i<5); }catch(InterruptedException exception){ System.out.println(exception.toString()); } } } //shared object class Account { int balance = 0; int i=0; public void deposit( ) { i=0; do { {

P a g e | 26

balance += 1; i++; System.out.println(balance + " deposit " + i); }while (i<10); } public void withdraw( ) { i=0; do { balance -= 1; i++; System.out.println(balance + " withdraw " + i ); }while (i<10); } public void enquire( ) { i=0; do { i++; System.out.println(balance + " Enquire " + i); }while (i<10); } }

Hasil program di atas adalah


1 deposit 1 2 deposit 2 3 deposit 3 4 deposit 4 5 deposit 5 7 Enquire 6 7 Enquire 7 7 Enquire 8 7 Enquire 9 7 Enquire 10 Finished executing

Kemudian

program

ke-duapuluhdua diubah dengan

tambahan

synchronized pada semua method di objek class account.


class Account {

P a g e | 27

int balance = 0; int i=0; public synchronized void deposit( ) { i=0; do { balance += 1; i++; System.out.println(balance + " deposit " + i); }while (i<10); } public synchronized void withdraw( ) { i=0; do { balance -= 1; i++; System.out.println(balance + " withdraw " + i ); }while (i<10); } public synchronized void enquire( ) { i=0; do { i++; System.out.println(balance + " Enquire " + i); }while (i<10); } }

Setelah program dijalankan maka lihat hasilnya, adalah:


1 deposit 1 2 deposit 2 3 deposit 3 4 deposit 4 5 deposit 5 -5 deposit 5 -4 deposit 6 -3 deposit 7 -2 deposit 8 -1 deposit 9 0 deposit 10 0 Enquire 1 0 Enquire 2

P a g e | 28

0 Enquire 3 0 Enquire 4 0 Enquire 5 0 Enquire 6 0 Enquire 7 0 Enquire 8 0 Enquire 9 0 Enquire 10 Finished executing

P a g e | 29

BAB III PENUTUP

3.1. Kesimpulan Thread adalah sebuah alur kontrol dari sebuah proses. Thread terbagi menjadi dua jenis yaitu Single Thread dan Multithread. Dilihat dari kegunaannya multithread adalah thread yang paling banyak dipakai akhir-akhir ini. Suatu proses yang multithreaded mengandung beberapa perbedaan alur kontrol dengan ruang alamat yang sama. Keuntungan dari multithreaded meliputi peningkatan respon dari user, pembagian sumber daya proses, ekonomis, dan kemampuan untuk mengambil keuntungan dari arsitektur multiprosesor. User level thread adalah thread yang tampak oleh programmer dan tidak diketahui oleh kernel. User level thread secara tipikal dikelola oleh sebuah library thread di ruang user. Kernel level thread didukung dan dikelola oleh kernel sistem operasi. Secara umum, user level thread lebih cepat dalam pembuatan dan pengelolaan dari pada kernel thread. Ada tiga perbedaan tipe dari model yang berhubungan dengan user dan kernel thread.

Model many to one: memetakan beberapa user level thread hanya ke satu buah kernel thread. Model one to one: memetakan setiap user thread ke dalam satu kernel thread. berakhir. Model many to many: mengizinkan pengembang untuk membuat user thread sebanyak mungkin, konkurensi tidak dapat tercapai karena hanya satu thread yang dapat dijadualkan oleh kernel dalam satu waktu.

Java adalah unik karena telah mendukung thread didalam tingkatan bahasanya. Semua program Java sedikitnya terdiri dari kontrol sebuah thread tunggal dan mempermudah membuat kontrol untuk multiple thread dengan program yang sama. JAVA juga menyediakan library berupa API(Application Program Interface) untuk membuat thread, termasuk method untuk suspend dan resume suatu thread, agar thread tidur untuk jangka waktu tertentu dan menghentikan thread yang berjalan. Sebuah java thread juga mempunyai empat kemungkinan keadaan, diantaranya: New, Runnable, Blocked dan Dead. Perbedaan API untuk mengelola thread seringkali mengganti keadaan thread itu sendiri.

P a g e | 30

DAFTAR PUSTAKA
J.E.N.I. -. Pengenalan Pemrograman 2. Jakarta: Jardiknas. Gata, Windu. 2005. Bahasa Pemrograman Java Gui, Error Exception, Thread, I/O (Input/Output), Database & Pembuatan Laporan . Jakarta:-. Silberschatz, Abraham, Peter Baer Galvin, dan Greg Gagne. 2005. Operating System Concepts. Seventh Edition. USA: John Wiley & Sons, Inc. www.java.lyracc.com/belajar/java-untuk-pemula/dasar-dasar-thread.