BAB I
PENDAHULUAN
BAB II
PEMBAHASAN
3
Page |4
thread (terstruktur) dan hanya mengerjakan satu tugas dalam satu waktu.
Di bawah ini merupakan gambar single thread.
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){
Page |5
try{
System.out.println(name + " started!");
do{
System.out.println(
" - stage: " + (stage+1)
);
pause = (int) (Math.random() * 1000);
stage++;
} while (stage<5);
}
catch(Exception exception){
System.out.println(exception.toString());
}
System.out.println(name + " finished!");
}
}
- stage: 3
- stage: 4
- stage: 5
horse3 finished!
Finished executing
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.
// Mulai Thread
horse1.start();
horse2.start();
horse3.start();
System.out.println("Race started!\n\n");
}
}
Page |8
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) 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
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.
P a g e | 13
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 | 17
akan diberikan sebuah jangka waktu tertentu untuk dieksekusi sebelum CPU
mengontrol thread lain yang memiliki prioritas yang sama.
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 ThreadPriority{
public static void main(String args[]){
A threadA=new A();
B threadB=new B();
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");
}
}
Membuat thread:
MyThread thr1 = new MyThread();
P a g e | 20
Menjalankan thread:
thr1.start();
Membuat Objek
MyThread myObject = new MyThread();
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.
.
P a g e | 21
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 meng-
update 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
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.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
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);
}
}
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!");
}
}
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.
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();
P a g e | 26
t3.start();
}
}
class MyThread implements Runnable {
Account account;
private int pause;
private int i = 0;
public MyThread (Account s) { 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 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;
P a g e | 27
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 {
balance += 1;
i++;
System.out.println(balance + " deposit " + i);
}while (i<10);
}
i++;
System.out.println(balance + " Enquire " + i);
}while (i<10);
}
}
class Account {
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++;
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 | 31
DAFTAR PUSTAKA
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.