12
Farhat, ST., MMSI., MSc Pemrograman Berorientasi Objek Universitas Gunadarma PEMROGRAMAN BERORIENTASI OBJEK “ Multithreaded Programming ” Oleh : Farhat, ST, MMSI, MSc { Diolah dari berbagai Sumber }

PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

  • Upload
    others

  • View
    24

  • Download
    2

Embed Size (px)

Citation preview

Page 1: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

PEMROGRAMAN BERORIENTASI OBJEK

“ Multithreaded Programming ”

Oleh : Farhat, ST, MMSI, MSc

{ Diolah dari berbagai Sumber }

Page 2: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

1. KONSEP DASAR PROGRAM MULTITHREADING

Seperti yang kita ketahui bahwa bahasa pemrograman java adalah bahasa yang memiliki banyak sekali fitur yang unik, salah satunya adalah fitur multithreading. Suatu program dengan menggunakan fitur multithreading dapat menjalankan 2 atau lebih kegiatan dalam waktu yang bersamaan. Konsep ini juga bisa disebut dengan multitasking.

Sebenarnya multitasking dibagi menjadi 2 bagian; Process Based dan Thread Base. Process Based adalah multitasking saat suatu program dijalankan bersamaan dengan program lain dalam satu waktu. Contoh kasus suatu multitasking Process Based adalah bila kita sedang menulis laporan di OpenOffice sambil mencari referensi di Internet dengan menggunakan Software Mozila sebagai Software Browser dalam satu waktu. Hal ini kita sedang menggunakan 2 software dalam satu waktu.

Thread Base adalah multitasking saat suatu program dijalankan, program itu dapat melakukan proses – proses lain yang dilakukan bersamaan dalam suatu waktu. Contohnya adalah bila kita sedang mencetak suatu lembar laporan yang kita lakukan di OpenOffice misalnya. Kadang sambil menunggu cetakan selesai, kita biasa melihat-lihat cetakan selanjutnya yang akan dicetak, dan kadang kita juga mengedit tulisan dengan merubah ukuaran huruf atau warna huruf misalnya. Nah, inilah proses Thread Base multitasking yang terjadi dalam kegiatan tersebut.

Dalam proses multitasking, ada keadaan yang mesti kita ketahui yaitu keadaan saat berjalan ( Running ) artinya adalah Processor menjalankan suatu kegiatan. Keadaan menghentikan sementara ( Suspend ) adalah kegiatan dari processor dihentikan sementara sampai keadaan dilanjutkan yaitu keadaan Resumed atau kadang keadaan pembatalan kegiatan processor (Blocked) dan terakhir keadaan selesai atau finishing (Terminating).

2. PENGERTIAN MULTITHREADING DAN THREAD

Multithreading adalah suatu kemampuan yang memungkinkan beberapa kumpulan instruksi atau proses dapat dijalankan secara bersamaan dalam sebuah program. Satu kumpulan instruksi yang akan dieksekusi secara independen dinamakan thread.

Thread sangat berguna untuk membuat proses yang interaktif; misalnya pada permainan (game). Dengan menggunakan sejumlah thread, program tetap dapat menggerakkan sejumlah objek sembari memberikan kesempatan pemakai untuk melakukan tanggapan melalui keyboard. Web browser merupakan contoh lain penggunaan thread. Tanpa thread, Web browser akan menghentikan segala tanggapan terhadap pemakai ketika perangkat lunak tersebut sedang mengambil isi dari suatu URL.

Page 3: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

3. IMPLEMENTASI THREAD

Thread pada Java ditangani melalui dua mekanisme. Cara pertama dilakukan dengan memperluas kelas Thread, sedangkan cara kedua dilakukan dengan mengimplementasikan Runnable.

a) Thread dengan Memperluas kelas Thread

Cara pertama untuk membuat thread adalah dengan memperluas kelas Thread dan kemudian menuliskan kembali kode pada metode run(). Secara prinsip, hal ini dilakukan dengan bentuk semacam berikut:

class namaKelas extends Thread {

public void run() {

}

Contoh - 1 :

// nama file : UjiThread.java

public class UjiThread {

public static void main (String [] args) {

Mobil m1 new Mobil(“M-1”);

Mobil m2 = new Mobil(“M-2”);

m1.start();

m2.start();

}}

class Mobil extends Thread {

// konstruktor

public Mobil (String id) { super (id);

}

// Mendefinisikan sendiri run()

public void run() {

String nama = getName();

for (int i=0; i<5; i++) {

try {

sleep(1000); // Tunggu 1 detik

}

catch(InterruptedException ie) { System.out.println(”Terinterupsi”);

}

System.out.println(”Thread ” + nama + ”:Posisi” + i );

}}}

Pembahasan Contoh – 1 :

public class UjiThread {

public static void main (String [] args) {

Mobil m1 = new Mobil(“M-1”); Mobil m2 = new

Mobil(“M-2”); m1.start();

m2.start();

}}

Page 4: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

Pada metode main(), yang menjadi titik awal pengeksekusian program, dua buah objek berkelas Mobil diciptakan dan dirujuk oleh m1 dan m2 secara berturutan. Pernyataan

m1.start();

yang terletak sesudah penciptaan kedua objek berkelas Mobil digunakan untuk menjalankan metode run()yang terdapat pada kelas Mobil untuk objek yang dirujuk oleh m1. Serupa dengan hal itu. m2.start(); Akan membuat run() pada kelas Mobil untuk objek yang dirujuk oleh m2 dijalankan.

Pendefinisian kelas Mobil dilakukan dengan membuatnya sebagai subkelas dari kelas Thread. Seperti sintaks berikut : class Mobil extends Thread { kelas Mobil menyebutkan extends Thread.

Didalam pendefinisian kelas Mobil terdapat pendefinisian konstruktor Mobil dan metode run(). Konstruktor didefinisikan sebagai berikut:

public Mobil (String id) { super (id);

}

Konstruktor mengandung sebuah parameter yang mewakili nama untuk thread. Parameter ini dilewatkann ke superkelas dengan memanggil super(id);

Metode run() menyatakan tindakan yang akan dilakukan oleh thread. Pada contoh ini, mula-mula nama thread diambil melalui pemanggilan metode getName() dan kemudian diberikan ke variabel bernama nama yang bertipe String. Selanjutnya, pernyataan for digunakan untuk menuliskan informasi sebanyak 5 buah baris yang mengandung nama thread dan posisinya. Namun, sebelum informasi ditulis, pernyataan tersebut akan membuat thread tertidur selama 1 detik melalui pernyataan:

try {

sleep(1000); // Tunggu 1 detik

}

catch(InterruptedException ie) { System.out.println(”Terinterupsi”);

}

Tujuannya adalah memberi kesempatan yang lebih besar terhadap thread lain untuk diproses. Pada pernyataan diatas, try…catch digunakan untuk menangkap eksepsi kalau terjadi suatu interupsi ketika thread tertidur. Ketika sebuah thread tertidur, ia benar-benar tidak melakukan kegiatan apapun. Jadi pada saat itu thread tersebut tidak menggunakan CPU sama sekali.

sleep() adalah metode pada kelas Thread (dan tentu saja diwariskan ke subkelas) yang berfungsi untuk membuat thread tertidur. Argumennya berupa nilai dalam satuan milidetik(1 detik sama dengan 1000milidetik).

Output Contoh - 1:

Thread M-1:Posisi0

Thread M-2:Posisi0

Thread M-1:Posisi1

Thread M-2:Posisi1

Thread M-1:Posisi2

Page 5: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

Thread M-2:Posisi2

Thread M-1:Posisi3

Thread M-2:Posisi3

Thread M-1:Posisi4

Thread M-2:Posisi4

Hasil diatas menunjukkan bahwa proses untuk thread dengan nama M-1 dan M-2 dilakukan secara bergantian

b) THREAD MELALUI RUNNABLE

Runnable sesungguhnya adalah sebuah interface. Dengan mengimplementasikan interface ini, sebuah kelas yang menangani thread dapat diciptakan. Kelas Thread merupakan implementasi dari Runnable. Secara prinsip, hal ini dilakukan dengan bentuk semacam berikut:

ObjekRunnable objek = new ObjekRunnable();

Thread namavar = new Thread(Objek Runnable);

Atau

New Thread(new ObjekRunnable());

Contoh - 2:

// nama file : UjiThread2.java

public class UjiThread2 {

public static void main (String [] args) {

Thread m1 = new Thread(new Mobil("M-1"));

Thread m2 = new Thread(new Mobil("M-2"));

m1.start();

m2.start();

}

}

class Mobil implements Runnable {

String nama;

// konstruktor

public Mobil (String id) {

nama = id;

}

public void run() {

for (int i=0; i<5; i++) {

try {

Thread.currentThread().sleep(1000);

}

catch(InterruptedException ie) { System.out.println("Terinterupsi");

}

System.out.println("Thread " + nama + ":Posisi" + i );

}}}

Page 6: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

Pembahasan Contoh – 2 :

Program diatas hampir sama dengan program UjiThread.java. Beberapa perbedaan yang perlu dibahas:

Pembuatan objek thread dilakukan melalui: Thread m1 = new Thread(new Mobil("M-1")); Thread m2 =

new Thread(new Mobil("M-2"));

Perhatikan bahwa m1 dan m2 merupakan variable yang merujuk objek berkelas Thread. Pembentukan objek dilakukan dengan menggunakan kelas Thread dengan argument berupa objek berkelas Mobil.

Kelas Mobil didefinisikan dengan mengimplementasikan interface Runnable seperti terlihat pada baris berikut:

class Mobil implements Runnable {

Di dalam kelas Mobil dideklarasikan variabel instan bernama nama, yang digunakan untuk menyimpan nama thread.

Di dalam konstruktor Mobil, variabel instan bernama nama tersebut diisi dengan nilai agumen.

Di dalam metode run(), mengingat sleep() adalah metode milik kelas Thread, pemanggilannya harus dilakukan dengan memlibatkan kelas tersebut. Seperti sintaks berikut:

Thread.currentThread().sleep(1000);

Dalam hal ini currentThread() adalah metode pada kelas Thread yang digunakan untuk memperoleh thread sekarang.

Output Contoh - 2:

Thread M-1:Posisi0 Thread M-2:Posisi0 Thread M-1:Posisi1 Thread M-2:Posisi1

Thread M-1:Posisi2 Thread M-2:Posisi2 Thread M-1:Posisi3 Thread M-2:Posisi3

Thread M-1:Posisi4 Thread M-2:Posisi4

c) SEBUAH THREAD MEMUNGKINKAN UNTUK MEMILIKI BEBERAPA STATE

1. Running :Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU.

2. Ready to run : Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk melakukannya.

3. Resumed : Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap untuk dijalankan.

4. Suspended : Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja.

Page 7: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

5. Blocked : Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan, karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi.

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.

Multithread berasal dari dua kata yakni multi dan thread. Multi bermakna banyak sementara thread bermakna benang atau alur. Namun dalam praktik sebenarnya, multithread adalah sebuah metode yang memungkinkan sebuah program menjalankan dua atau lebih operasi dalam satu waktu. Sebenarnya ketika kita membuat sebuah program, secara otomatis kita sudah memiliki satu thread dalam program tersebut. Membuat sebuah program yang menginginkan berjalan dengan banyak thread dilakukan dengan dua cara: cara mengimplementasi interfaceRunnable dan meng-extends kelas Thread itu sendiri.

Dengan demikian, kelas tersebut harus mengimplementasikan pula satu method yaitu method run(); yang dideklarasikan sebagai berikut: public void run(){} Setelah membuat kelas yang mengimplementasikan interface Runnable, kita dapat menginstansiasi objek dengan tipe Thread di dalam kelas main.

Page 8: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

4. KEUNTUNGAN MULTITHREADING

Keuntungan dari sistem yang menerapkan multithreading dapat kita kategorikan menjadi 4 bagian:

a) Responsif. Aplikasi interaktif menjadi tetap responsif meskipun sebagian dari program sedang diblok atau melakukan operasi lain yang panjang. Umpamanya, sebuah thread dari web browser dapat melayani permintaan pengguna sementara thread yang lain berusaha menampilkan gambar.

b) Berbagi sumber daya. Beberapa thread yang melakukan proses yang sama akan berbagi sumber daya. Keuntungannya adalah mengizinkan sebuah aplikasi untuk mempunyai beberapa thread yang berbeda dalam lokasi memori yang sama.

c) Ekonomis. Pembuatan sebuah proses memerlukan pengalokasian memori dan sumber daya. Alternatifnya adalah dengan menggunakan thread, karena thread membagi memori dan sumber daya yang dimilikinya sehingga lebih ekonomis untuk membuat thread dan context switching thread. Akan susah mengukur perbedaan waktu antara thread dan switch, tetapi secara umum pembuatan dan pengaturan proses akan memakan waktu lebih lama dibandingkan dengan thread. Pada Solaris, pembuatan proses memakan waktu 30 kali lebih lama dibandingkan pembuatan thread sedangkan proses context switch 5 kali lebih lama dibandingkan context switching thread.

d) Utilisasi arsitektur multiprosesor. Keuntungan dari multithreading dapat sangat meningkat pada arsitektur multiprosesor, dimana setiap thread dapat berjalan secara paralel di atas procesor yang berbeda. Pada arsitektur processor tunggal, CPU menjalankan setiap thread secara bergantian tetapi hal ini berlangsung sangat cepat sehingga menciptakan ilusi paralel, tetapi pada kenyataanya hanya satu thread yang dijalankan CPU pada satu-satuan waktu.

5. MODEL MULTITHREADING

Terminologi Pembahasan

Thread pengguna Thread yang pengaturannya dilakukan oleh pustaka thread pada tingkatan pengguna. Karena pustaka yang menyediakan fasilitas untuk pembuatan dan penjadwalan thread, thread pengguna cepat dibuat dan dikendalikan

Thread Kernel Thread yang didukung langsung oleh kernel. Pembuatan, penjadwalan dan manajemen thread dilakukan oleh kernel pada kernel space. Karena dilakukan oleh sistem operasi, proses pembuatannya akan lebih lambat jika dibandingkan dengan thread pengguna.

Model-Model MultiThreading :

a) Model Many-to-One. Model ini memetakan beberapa thread tingkatan pengguna ke sebuah thread. tingkatan kernel. Pengaturan thread dilakukan dalam ruang pengguna sehingga efisien. Hanya satu thread pengguna yang dapat mengakses thread kernel pada

Page 9: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

satu saat. Jadi Multiple thread tidak dapat berjalan secara paralel pada multiprosesor. Contoh: Solaris Green Threads dan GNU Portable Threads.

b) Model One-to-One. Model ini memetakan setiap thread tingkatan pengguna ke setiap thread. Ia menyediakan lebih banyak concurrency dibandingkan model Many-to-One. Keuntungannya sama dengan keuntungan thread kernel. Kelemahan model ini ialah setiap pembuatan thread pengguna memerlukan tambahan thread kernel. Karena itu, jika mengimplementasikan sistem ini maka akan menurunkan kinerja dari sebuah aplikasi sehingga biasanya jumlah thread dibatasi dalam sistem. Contoh: Windows NT/XP/2000 , Linux, Solaris 9.

c) Model Many-to-Many. Model ini memultipleks banyak thread tingkatan pengguna ke thread kernel yang jumlahnya sedikit atau sama dengan tingkatan pengguna. Model ini mengizinkan developer membuat thread sebanyak yang ia mau 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.

6. PRIORITAS THREAD

Setiap thread dalam Java memiliki prioritas. Defaultnya, suatu thread menurunkan prioritas dari thread induknya atau dapat menaikkan/menurunkan prioritas setiap thread. Kelas Thread menyediakan metode setPriority() dengan argument berupa angka yang menyatakan prioritas antara MIN_PRIORITY(didefinisikan sebagai 1 dalam kelas Thread) dan MAX_PRIORITY ( didefinisikan sebagai 10). NORM_PRIORITY didefinisikan sebagai 5.

Contoh:

// nama file : UjiPrioritas.java

public class UjiPrioritas {

public static void main (String [] args) {

Mobil m1 = new Mobil("M-1");

Mobil m2 = new Mobil("M-2");

m2.setPriority(8); m1.start();

m2.start();

}}

class Mobil extends Thread {

// konstruktor

public Mobil (String id) {

super (id);

}

// Mendefinisikan sendiri run()

public void run() {

String nama = getName(); for (int i=0; i<5; i++) {

System.out.println("Thread " + nama + ":Posisi " + i );

}

}}m2.setPriority(8);

// digunakan untuk mengatur prioritas m2 agar lebih tinggi daripada m1.

Page 10: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

Output :

Thread M-2:Posisi 0

Thread M-2:Posisi 1

Thread M-2:Posisi 2

Thread M-2:Posisi 3

Thread M-2:Posisi 4

Thread M-1:Posisi 0

Thread M-1:Posisi 1

Thread M-1:Posisi 2

Thread M-1:Posisi 3

Thread M-1:Posisi 4

Page 11: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

KESIMPULAN

1. Thread adalah alur kontrol dari suatu proses. 2. Keuntungan menggunakan Multithreading:

a. Meningkatkan respon dari pengguna. b. Pembagian sumber daya. c. Ekonomis. d. Mengambil keuntungan dari arsitektur multiprosessor.

3. Tiga model Multithreading: 1. Model Many-to-One. 2. Model One-to-One. 3. Model Many-to-Many.

4. Pembatalan Thread: Tugas untuk membatalkan Thread sebelum menyelesaikan tugasnya. 5. Pembatalan Thread terdiri dari 2 jenis:

a. Asynchronous cancellation. b. Deffered cancellation.

6. Thread Pools menciptakan sejumlah Thread yang ditempatkan di dalam pool dimana Thread menunggu untuk dipanggil.

7. Thread Schedulling ada 2 macam: a. Local Schedulling. b. Global Schedulling.

CONTOH PROGRAM DALAM BAHASA JAVA

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

packageoop2_widy1_multi_threading;

classthrid extendsThread

{

String nama;

publicthrid(String a)

{

nama = a;

}

publicvoidrun()

{

for(bytei = 0; i<10; i++)

{

System.out.println(nama);

}

}

}

publicclassMain

{

publicstaticvoidmain(String[] args)

{

thrid dia = newthrid("Menghitung Angka Ke-3");

thrid mod = newthrid("Menghitung Angka Ke-2");

dia.start();

Page 12: PEMROGRAMAN BERORIENTASI OBJEK Multithreaded ...farhana.salim.staff.gunadarma.ac.id/Downloads/files/...Pemrograman Berorientasi Objek Universitas Gunadarma Pada metode main(), yang

Farhat, ST., MMSI., MSc

Pemrograman Berorientasi Objek Universitas Gunadarma

25

26

27

28

29

30

31

32

mod.start();

inta = 10;

for(inti = 0; i <= a; i++)

{

System.out.println("Menghitung Angka Ke-1");

}

}

}

Hasilnya Adalah :