Network Programming 2010 Pemrograman Multi-Thread

dokumen-dokumen yang mirip
Exception Handling and Multithreading

Pemrograman Berorientasi Obyek (IT251) Ramos Somya, S.Kom., M.Cs.

Thread. 16 th week Estu Sinduningrum ST,MT

Mengunci sebuah object: Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu

PERTEMUAN VII Multithreaded Programming. Praktikan mampu membuat program sederhana mengenai threading

Java Progamming Multithreading

BAB 2. Class Thread. Setelah mempelajari modul ini peserta diharapkan dapat: Mengenal Kelas Thread Menggunakan Kelas Thread dalam aplikasi

Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Tabel berikut ini adalah rangkuman dari class Thread.

Konsep Lanjut Pemrograman Berorientasi Obyek

ILUSTRASI KLASIK: BOUNDED BUFFER

EXCEPTION HANDLING. 1. Mampu menangani eksepsi 2. Mengetahui dan memahami tentang multithreading 3. Dapat membuat program tentang exception handling

BAB 2 COLLECTION & THREAD

Pada pembuatan game di java, sering kali para programer. mendefinisikan banyak object seperti suara, gambar, dan grafik geometri yang

PENANGANAN EKSEPSI. class Exc0 { public static void main (String args[]) { int d = 0; int a = 42 / d; } }

Score: Persentase: % ~ u ~ Generated by Foxit PDF Creator Foxit Software For evaluation only.

BAB IX THREAD Thread ClassThread namavar = new ClassThread(); Namavar.start(); New ClassThread().start();

Kelompok 12. Thread Java

PERTEMUAN III OBJEK DAN CLASS TUJUAN PRAKTIKUM

PEMROGRAMAN JAVA : THREAD

PEMROGRAMAN BERORIENTASI OBJEK COLLECTION DAN MULTITHREADING. ADAM MUKHARIL BACHTIAR TEKNIK INFORMATIKA UNIKOM

1.Tujuan. 2. Latar Belakang

PERTEMUAN 7 MULTITHREADED PROGRAMMING

Pemrograman Berorientasi Objek Collection dan Multithreading. Adam Mukharil Bachtiar Teknik Informatika UNIKOM

2. Pilih instruksi yang dapat digunakan dalam method actionperformed untuk membedakan antara tombol buttonone dan buttontwo.

Monitor. Process Synchronization. SISTIM OPERASI (IKI-20230) ProcessSynchronization Ch. 6. Johny Moningka

1. Latar Belakang Didalam pembuatan game java sering kali kita mendefinisikan banyak object seperti gambar, dan grafik geometri yang begitu banyak,

2 TIPE DATA DAN VARIABEL

Bab 26. Readers/Writers

PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA

Bab Tujuan. 9.2 Definisi dan dasar-dasar thread Definisi Thread

PEMROGRAMAN SOCKET LANJUTAN

BAB II VARIABEL DAN TIPE DATA

TUGAS SISTEM TERDISTRIBUSI MULTYTHREAD EKO SURIPTO P

Abstract Class dan Interface. Viska Mutiawani, M.Sc

Sistem Terdistribusi

Badiyanto, S.Kom., M.Kom. PBO java

A. TUJUAN PEMBELAJARAN 1. Mengetahui cara menangani exception dengan cara melempar exception. 2. Mengetahui cara membuat sendiri class exception.

PRAKTIKUM 6 EXCEPTION

MENGENAL JAVA SEBAGAI PEMROGRAMAN BERORIENTASI OBJEK DAN IMPLEMENTASI THREAD DI LINGKUNGAN UNIX/ LINUX. Hary Cahyono

PEMAHAMAN DASAR DASAR JAVA

Network Programming 2010 Pertemuan-4. Pemrograman Socket. Husni. Husni.trunojoyo.ac.id Komputasi.wordpress.

Percabangan & Perulangan

PERTEMUAN 3 OBJEK DAN CLASS

Cara Membaca File Text di JAVA

PRAKTIKUM 7 DASAR INPUT OUTPUT

1. Mampu mengimplementasikan thread dalam sebuah aplikasi 2. Memahami kegunaan thread dalam aplikasi

Membuat dan Menggunakan Class

public class Test { int i = 6; int j = 3; System.out.println(i/j); } Output :

BAHASA PEMROGRAMAN JAVA

Pemrograman Berorientasi Object

PEMROGRAMAN JAVA. Petunjuk Penulisan Program Token Aturan Penamaan Identifier Lingkungan /Scope dari variabel Tipe Data (i) Yoannita

IKG2I4 / Software Project I

Pengenalan JavaScript

SATUAN ACARA PERKULIAHAN MATA KULIAH: Algoritma & Pemrograman 3 Strata/Jurusan : S1/Sistem Komputer

SUMBER BELAJAR PENUNJANG PLPG

Direktori yang diperlihatkan pada gambar 1. tersebut adalah untuk satu unit (mis. disk pack atau tape reel) dari penyimpanan sekunder. Labelnya berisi

MODUL 9 EXCEPTION HANDLING

TPI4202 e-tp.ub.ac.id. Lecture 4 Mas ud Effendi

IF PEMROGRAMAN LANJUT EXCEPTION. Oleh : Andri Heryandi, M.T.

TUGAS Mata Kuliah : Sistem Terdistribusi

Java Thread Games Series

BAB 3 TYPE DATA, VARIABLE DAN OPERATOR

DASAR PEMOGRAMAN JAVA

Inheritance dan Kata Kunci static

Topik. Stream I/O Cara menggunakan Stream Hierarchy Java I/O Membaca File Menulis File Menghapus File Cara membaca isi Direktori dalam file

Definisi Eksepsi (exception)

Percobaan 6 Exception

IKG2I4 / Software Project I

Pemrograman Berorientasi. Class dan Obyek 2

1. Manakah jawaban yang benar,pada saat Anda mengcompile dan menjalankan class berikut ini:

SATUAN ACARA PERKULIAHAN MATA KULIAH: Algoritma & Pemrograman 3 Strata/Jurusan : D3/Teknik Komputer

PERCOBAAN 6 EXCEPTION

Multithreading dengan python (bagian 1)

Mahasiswa dapat memahami konsep dasar deskripsi dan kontrol pada proses

Gambar 1. Single Linked List

E-Book PEMROGRAMAN BERORIENTASI OBJEK. Disusun Oleh: Arfian Hidayat, S.Kom

Modul Praktikum 4 Pemograman Berorientasi Objek

SEKOLAH TINGGI MANAJEMEN INFORMATIKA & KOMPUTER JAKARTA STI&K SATUAN ACARA PERKULIAHAN

Java Application. Aplikasi: Menampilkan Tulisan

MODUL III ARRAYLIST TUGAS PENDAHULUAN

EXCEPTION. 2. Pada kondisi bagaimana klausa finally tidak akan dieksekusi? Kode didalam block try memiliki statement return

Praktikum 9 Exception Handling

Riwayat Pendidikan: SDK Lemuel II, Pos Pengumben, Jakarta Barat SMPK Lemuel, Pos Pengumben, Jakarta Barat SMUN 78, Kemanggisan, Jakarta Barat

Sistem Terdistribusi

Java Application. Menampilkan Tulisan

PEMOGRAMAN JAVA. Yoannita. Tipe Data (ii) : Array Exception Handling

BAB 2 INPUT DARI KEYBOARD

Socket pada UDP. Husni Husni.trunojoyo.ac.id Komputasi.wordpress.com

Dasar Pemrograman Java

Sistem Operasi Pertemuan 5 Concurrency: Mutual Exclusion & Synchronization

PEMOGRAMAN JAVA. Yoannita, S.Kom. Class(ii) [Constructor] [keyword this] Modifier Passing parameter [by value] [by references]

Elemen Dasar Dalam Bahasa Java

LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom

PEMROGRAMAN JAVA. Yoannita, S.Kom. Input Kondisi (IF-ELSE, SWITCH)

CLASS, METHOD DAN MODIFIER

BAB 4. SINKRONISASI & DEADLOCK

Variabel tersebut seharusnya bisa dideklarasikan didalam try block dan block catch

AP2B Dini Triasanti STRUKTUR PEMROGRAMAN PYTHON

BAB 8 PENGENALAN KONTROL INPUT/OUTPUT

Transkripsi:

Network Programming 2010 Pemrograman Multi-Thread Husni husni@if.trunojoyo.ac.id Husni.trunojoyo.ac.id Komputasi.wordpress.com

MultiThreading Menurut Free Online Dictionary of Computing (FOLDOC) Berbagi-pakai satu Processor antara banyak task (atau "thread") dalam suatu cara yang dirancang untuk meminimalkan waktu yang diperlukan untuk berganti task. Ini dibangun dengan berbagi-pakai sebanyak mungkin lingkungan eksekusi program antara task-task berbeda sehingga sangat sedikit status yang perlu disimpan dan direstore ketika task-task tersebut berubah. 2

Outline Multithreading Pembuatan Thread Menurunkan kelas Thread Mengimplementasikan Interface Runnable Metode dalam Thread Thread Pool Sinkronisasi Komunikasi Antar Thread Deadlock 3

Proses & Thread C P U main run Process 1 Process 2 Process 3 Process 4 GC 4

Concurrency & Paralellism CPU CPU1 CPU2 5

Concurrency & Paralellism CPU CPU1 CPU2 main main RAM run main run this.count run main main main run 6

Thread Thread adalah aliran (stream) tunggal dari eksekusi dalam suatu proses. Process adalah program yang berjalan dalam ruang alamatnya sendiri. Semua program saat ini terdiri dari thread. Kontrol atau eksekusi utama dari semua program (sejauh ini) dikendalikan oleh suatu thread tunggal. Akan kita lihat: mutlithreading atau ada banyak thread berjalan dalam program yang sama. 7

MultiTasking & Multithreading Pengguna lebih akrab dengan multitasking. Multitasking: Ada lebih dari satu program bekerja (seolah) pada waktu yang sama. SO menjatahkan CPU ke program-program berbeda dengan suatu cara untuk memberikan pengaruh dari concurrency. Ada dua jenis multitasking - preemptive dan cooperative. Multithreading: Perluasan ide multitasking dengan membolehkan program mempunyai banyak task. Setiap task di dalam program dinamakan thread. 8

Multi-Thread & Multi-Processor Banyak thread pada banyak processor Thread 1 Thread 2 Thread 3 Banyak thread pada satu processor Thread 1 Thread 2 Thread 3

Java & Multi-Thread Fitur multithreading pada java sudah built-in. Java menyediakan kelas Thread untuk menangani threadthread dalam program. Ada dua cara membuat obyek Thread. Membuat obyek dari sub-kelas dari kelas Thread Meng-implements interface Runnable pada suatu obyek Sub-Kelas Thread class ThreadX extends Thread { public void run() { //apa yang dikerjakan thread ThreadX tx = new ThreadX( ); 10 tx.start( );

Implements Interface Runnable Runnable Sub-Kelas class RunnableY implements Runnable { public void run() { //apa yang dikerjakan thread RunnableY ry = new RunnableY(); Thread ty = new Thread(ry); ty.start(); 11

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: Thread( String n) membuat Thread baru dengan nama n. Thread( Runnable target) membuat obyek Thread baru Thread( Threadgroup group, Runnable target) Membuat obyek Thread baru dalam Threadgroup. 12

Metode Dalam Kelas Thread Metode Statis: activecount(); currentthread(); sleep(); yield(); Metode Instance: getpriority( ); setpriority( ); start( ); stop( ); run( ); isalive( ); suspend( ); resume( ); join( ); 13

Diagram Status Thread Alive (Thread Hidup) Running new CounterThread1(max); while ( ) { New Thread cntthread.start(); Runnable Dead Thread Metode run() selesai Blocked Object.wait() Thread.sleep() Menunggu selesainya IO Menunggu pada monitor 14

Diagram Status Thread new start() runnable stop() dead wait() sleep() suspend() blocked notify() slept resume() unblocked non-runnable 15

16

Properti Thread sleep suspend blocked new start done runnable resume wait notify stop Blok I/O dead I/O selesai 17

Membuat Thread Membuat obyek dari sub-kelas Thread. Berarti buat sub-kelas tersebut lebih dulu. Contoh ini membuat 5 obyek thread bernama SimpleThread. Perhatikan hasilnya! Mengapa? public class SimpleThread extends Thread { private int countdown = 3; private static int threadcount = 0; private int threadnumber = ++threadcount; public SimpleThread( ) { System.out.println( Membuat " + threadnumber++); 18

public void run( ) { while(true) { System.out.println("Thread " + threadnumber + " (" + countdown + ") berjalan"); if (--countdown == 0) return; public static void main(string[] args) { for (int i = 0; i < 5; i++) new SimpleThread( ).start( ); System.out.println( Semua Thread dimulai..."); 19

Output: Kemungkinan Membuat 1 Membuat 2 Membuat 3 Thread 2 (3) berjalan Thread 2 (2) berjalan Thread 2 (1) berjalan Membuat 4 Thread 4 (3) berjalan Thread 4 (2) berjalan Thread 4 (1) berjalan Membuat 5 Semua Thread dimulai... Thread 3 (3) berjalan Thread 3 (2) berjalan Thread 3 (1) berjalan Thread 5 (3) berjalan Thread 5 (2) berjalan Thread 6 (3) berjalan Thread 5 (1) berjalan Thread 6 (2) berjalan Thread 6 (1) berjalan 20

Output: Kemungkinan T main T 0 T 1 T 2 T 3 T 4 Membuat 1 Membuat 2 Membuat 3Membuat 4Membuat 5 Semua Thread dimulai... 2(3) 3(3) 4(3) 5(3) 6(3) 2(2) 3(2) 4(2) 5(2) 6(2) 2(1) 3(1) 4(1) 5(1) 6(1) 21

Menggunakan Interface Runnable Tujuan: Membuat dan menjalankan 3 thread: Thread pertama mencetak huruf a 100 kali. Thread kedua mencetak huruf b 100 kali. Thread ketiga mencetak bilangan 1 s.d 100. 22

public class TaskThreadDemo { public static void main(string[] args) { // Membuat task Runnable printa = new PrintChar('a', 100); Runnable printb = new PrintChar('b', 100); Runnable print100 = new PrintNum(100); // Membuat thread Thread thread1 = new Thread(printA); Thread thread2 = new Thread(printB); Thread thread3 = new Thread(print100); // Jalankan thread thread1.start(); thread2.start(); thread3.start(); 23

// Tugas mencetak karakter tertentu sebanyak tertentu class PrintChar implements Runnable { private char chartoprint; // karakter yang dicetak private int times; // banyaknya perulangan // constructor: karakter yang akan dicetak dan jumlahnya public PrintChar(char c, int t) { chartoprint = c; times = t; // Override metode run(): apa yang dikerjakan dalam thread? public void run() { for (int i = 0; i < times; i++) { System.out.print(charToPrint); 24

// Tugas mencetak bilangan 1 s.d n class PrintNum implements Runnable { private int lastnum; //constructor mencetak 1, 2,... i */ public PrintNum(int n) { lastnum = n; //apa yang dikerjakan dalam thread? public void run() { for (int i = 1; i <= lastnum; i++) { System.out.print(" " + i); 25

Output: Kemungkinan abbbbbbbbbbb 1 2 3 4 5 6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 7bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 26

Metode Statis yield() Metode ini digunakan untuk melepas waktu (sementara) untuk thread lain. Contoh: kita mengubah isi metode run() dalam kelas PrintNum menjadi: public void run() { for (int i = 1; i <= lastnum; i++) { System.out.print(" " + i); Thread.yield(); Setiap kali suatu bilangan dicetak, thread print100 mengalah. Akibatnya, bilangan dicetak setelah karakter. 27

Output: Kemungkinan aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaab bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbb 2bbbbbbbbbbbbbbbbbbbbbbb 3b 4 5b 6b 7bbbbbbbbb 8b 9b 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32b 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 28

Setiap kali bilangan (>= 50) dicetak, thread print100 tidur 29 selama 1 mili detik. Metode Statis sleep() Metode sleep(long milidetik) menidurkan thread selama waktu tertentu. Contoh: tambahkan teks merak berikut ke dalam metode run() sebelumnya: public void run() { for (int i = 1; i <= lastnum; i++) { System.out.print(" " + i); try { if (i >= 50) Thread.sleep(1); catch (InterruptedException ex) {

Metode Join() Metode ini dapat digunakan untuk memaksa satu thread menunggu thread lain selesai. Bilangan setelah 50 dicetak setelah thread printa selesai. 30

Metode isalive(), interrupt(), isinterrupted() Metode isalive() digunakan untuk mendapatkan starus dari suatu thread. Mengembalikan true jika thread berstatus Ready, Blocked atau Running; false jika thread masih baru, belum dimulai atau telah selesai. Metode interrupt() menyela suatu thread dengan cara berikut: Jika suatu thread dalam status Ready atau Running, flag interrupted nya diset; jika statusnya blocked, dibangunkan dan masuk ke status Ready, dan java.io.interruptedexception dibuat. Metode isinterrupt() memeriksa apakah thread diinterupsi. 31

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(). 32

Prioritas Thread Setiap thread diberikan prioritas default Thread.NORM_PRIORITY. Prioritas dapat direset menggunakan metode setpriority(int priority). Beberapa konstanta untuk prioritas: Thread.MIN_PRIORITY Thread.MAX_PRIORITY Thread.NORM_PRIORITY 33

Thread Pool Memulai suatu thread baru untuk setiap task dapat membatasi throughput dan menurunkan kinerja. Thread pool sangat cocok untuk mengelola sejumlah task yang berjalan secara konkuren. JDK 1.5 menggunakan interface Executor untuk mengeksekusi task-task dalam suatu thread pool dan interface ExecutorService untuk mengelola dan mengontrol task-task. ExecutorService merupakan sub-interface dari Executor. 34

Interface Executor & ExecutorService 35

Pembuatan Executor Gunakan metode yang statis di dalam kelas Executors. 36

import java.util.concurrent.*; public class ExecutorDemo { public static void main(string[] args) { // buat thread pool tetap, maksimum 3 thread ExecutorService executor = Executors.newFixedThreadPool(3); // Kirim task runnable ke executor executor.execute(new PrintChar('a', 100)); executor.execute(new PrintChar('b', 100)); executor.execute(new PrintNum(100)); // Matikan executor executor.shutdown(); 37

Thread Pool Jika baris ke-6 diganti menjadi: ExecutorService executor = Executors.newFixedThreadPool(1); Apa yang terjadi? Tuliskan kodenya dan jalankan! Bagaimana diganti menjadi: ExecutorService executor = Executors.newCachedThreadPool(); 38

Sinkronisasi Sinkronisasi merupakan mekanisme untuk mengontrol eksekusi dari thread-thread berbeda sehingga ketika banyak thread mengakses variabel shared, dapat dipastikan eksekusinya benar. Java punya keyword synchronized dapat digunakan untuk memperkenalkan suatu segmen kode atau metode yang akan dapat diakses hanya oleh suatu thread tunggal pada satu waktu. Sebelum memasuki wilayah sinkronisasi, suatu thread akan memperoleh semaphore yang berasosiasi dengan wilayah tersebut jika telah diambil oleh thread lain, maka thread tersebut mem-blokir (menunggu) sampai semaphore dilepas. 39

class Account { private int balance = 0; synchronized void deposit(int amount) { balance += amount; int getbalance() { return balance; class Customer extends Thread { Account account; Customer(Account account) { this.account = account; 40

public void run() { try { for (int i = 0; i < 10000; i++) { account.deposit(10); catch (Exception e) { e.printstacktrace(); /* metode run */ /* kelas Customer */ public class BankDemo { private final static int NUMCUSTOMER = 10; public static void main(string args[ ]) { //buat account Account account = new Account(); 41

//buat dan jalankan thread customer Customer customer[ ] = new Customer[NUMCUSTOMER]; for (int i = 0; i < NUMCUSTOMER; i++) { customer[i] = new Customer(account); customer[i].start( ); //menunggu thread customer selesai for (int i = 0; i < NUMCUSTOMER; i++) { try { customer[i].join( ); catch (InterruptedException e) { e.printstacktrace( ); //menampilkan saldo (balance) account System.out.println(account.getBalance( ) ); 42

Sinkronisasi Dalam Java, obyek dengan satu atau lebih metode synchronized disebut sebagai monitor. Ketika thread memanggil metode synchronized, hanya satu thread yang dibolehkan pada satu waktu, lainnya menunggu dalam antrian (queue). Dalam aplikasi jenis producer- consumer, thread consumer mungkin mendapatkan tidak ada cukup elemen untuk dikonsumsi. Tanggungjawab monitor untuk memastikan bahwa thread-thread yang menunggu producer diberitahu segera setelah elemen-elemen diproduksi. 43

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() 44

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. 45

class Producer extends Thread { Queue queue; Producer (Queue queue) { this.queue = queue; public void run { int i = 0; while(true) { queue.add(i++); 46

class Comsumer extends Thread { String str; Queue queue; Consumer (String str, Queue queue) { this.str = str; this.queue = queue; public void run { while(true) { System.out.println(str + : + queue.remove();); 47

class queue { private final static int SIZE = 10; int array[ ] = new int[size]; int r = 0; int w = 0; int count = 0; synchronized void add(int i) { //menunggu selama antrian (queue) penuh while (count == SIZE) { try { wait( ); catch (InterruptedException ie) { ie.printstacktrace( ); System.exit(0); /* metode add */ 48

//Tambahkan data ke array dan atur pointer write array[w++] = i; if (w >= SIZE) w = 0; ++count; //Naikkan nilai count notifyall( ); //Beritahu thread-thread yang menunggu synchronized int remove( ) { //menunggu selama queue kosong while (count == 0) { try { wait( ); catch (InterruptedException ie) { ie.printstacktrace( ); System.exit(0); 49

//baca data dari array dan atur pointer read int element = array[r++]; if (r >= SIZE) r = 0; --count; //Turunkan count notifyall( ); //Beritahu thread-thread yang menunggu return element; public ProducerConsumer { public static void main(string args[ ]) { Queue queue = new Queue( ); new Producer(queue).start( ); new Consumer( ConsumerA, queue).start( ); new Consumer( ConsumerB, queue).start( ); new Consumer( ConsumerC, queue).start( ); 50

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. Masingmasing selalu menunggu yang lain untuk melepaskan kunci yang dibutuhkannya. 51

Tugas Pelajari dengan baik konsep multithreading di atas. Perbaiki program EchoServer dan EchoClient sehingga server dapat menerima koneksi dari 5 client pada waktu yang bersamaan Tambahkan satu variabel di server, misalnya X yang hanya dapat diakses oleh satu client pada satu waktu. X mencatat pesan teks yang sebelumnya dikirim oleh client tertentu! 52