Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

Pengenalan Pemrograman 2 Versi 2.0 Thread. Topik Pengertian Thread Dasar-dasar Thread ◦State dari Thread ◦Prioritas Class Thread ◦Constructor ◦Constants.

Presentasi serupa


Presentasi berjudul: "Pengenalan Pemrograman 2 Versi 2.0 Thread. Topik Pengertian Thread Dasar-dasar Thread ◦State dari Thread ◦Prioritas Class Thread ◦Constructor ◦Constants."— Transcript presentasi:

1 Pengenalan Pemrograman 2 Versi 2.0 Thread

2 Topik Pengertian Thread Dasar-dasar Thread ◦State dari Thread ◦Prioritas Class Thread ◦Constructor ◦Constants ◦Method

3 Topik Membuat Threads ◦Menurunkan Class (Extend) Thread ◦Meng-implementasikan Interface Runnable ◦Extend vs. Implement Sinkronisasi ◦Mengunci Object Komunikasi Antar Thread (Interthread) Kemampuan Concurrency

4 Threads Mengapa menggunakan threads? ◦Dibutuhkan untuk mengatasi aliran proses Pengertian ◦Merupakan sebuah pengontrol aliran program ◦Untuk lebih mudahnya, bayangkanlah threads sebagai proses yang dieksekusi oleh sebuah program ◦Contoh:  Operating System  HotJava web browser

5 Threads

6 State dari Thread Sebuah thread memungkinkan untuk memiliki beberapa state : 1.Running  Thread yang sedang dieksekusi  Didalam control dari CPU 2.Ready to run  Siap untuk dieksekusi tetapi belum ada kesempatan untuk melakukannya 3.Resumed  Siap dijalankan setelah diberhentikan sementara atau diblok 4.Suspended  Thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja 5.Blocked  Menunggu sebuah resource tersedia atau sebuah event terjadi

7 Prioritas Thread Mengapa menggunakan prioritas? ◦Menentukan thread mana yang akan menerima control dari CPU dan akan dieksekusi pertama kali Pengertian: ◦Nilai integer dari angka 1 sampai dengan 10 ◦Prioritas thread paling tinggi → semakin besar kesempatan untuk dieksekusi terlebih dahulu ◦Contoh:  Dua threads siap untuk dijalankan  Thread pertama: prioritas nomor 5, telah dijalankan  Thread kedua: prioritas nomor 10, dijalankan ketika thread pertama sedang dijalankan

8 Prioritas Thread Context switch ◦Terjadi apabila sebagian dari thread telah dikontrol oleh CPU dari thread yang lain ◦Ketika switch terjadi?  prioritas tertinggi dari thread adalah thread yang siap untuk menerima kontrol dari CPU  Pada saat sebuah thread yang sedang berjalan diambil alih oleh thread yang memiliki prioritas tertinggi Lebih dari satu prioritas thread yang siap untuk dijalankan ◦Menentukan prioritas untuk menerima kontrol dari CPU bergantung pada sistem operasi ◦Windows 95/98/NT: Menggunakan time-sliced dan round-robin ◦Solaris: Membiarkan CPU untuk mengontrol thread yang lain

9 Class Thread : Constructor Memiliki delapan constructor Thread Constructors 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 dimana method run dipanggil. Thread(Runnable target, String name) Membuat sebuah object Thread yang baru dengan nama yang spesifik dan berdasarkan pada object Runnable.

10 Class Thread : Constants Berisi field untuk nilai prioritas Thread Constants public final static int MAX_PRIORITY Nilai prioritas maksimum, 10 public final static int MIN_PRIORITY Nilai prioritas minimum, 1. public final static int NORM_PRIORITY Nilai default prioritas, 5.

11 Class Thread : Methods Beberapa method Thread Thread Methods public static Thread currentThread() Mengembalikan sebuah reference kepada thread yang sedang berjalan. public final String getName() Mengembalikan nama dari thread. public final void setName(String name) Mengulang pemberian nama thread sesuai dengan argument name. Hal ini dapat 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.

12 Contoh Sebuah Thread 1 import javax.swing.*; 2 import java.awt.*; 3 class CountDownGUI extends JFrame { 4 JLabel label; 5 CountDownGUI(String title) { 6 super(title); 7 label = new JLabel("Start count!"); 8 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 9 getContentPane().add(new Panel(),orderLayout.WEST); 10 getContentPane().add(label); 11 setSize(300,300); 12 setVisible(true); 13 } 14 //bersambung...

13 Contoh Sebuah Thread 15 void startCount() { 16 try { 17 for (int i = 10; i > 0; i--) { 18 Thread.sleep(1000); 19 label.setText(i + ""); 20 } 21 Thread.sleep(1000); 22 label.setText("Count down complete."); 23 Thread.sleep(1000); 24 } catch (InterruptedException ie) { 25 } 26 label.setText(Thread.currentThread().toString()); 27 } 28 //bersambung...

14 Contoh Sebuah Thread 29 public static void main(String args[]) { 30 CountDownGUI cdg = 31 new CountDownGUI("Count down GUI"); 32 cdg.startCount(); 33 } 34 }

15 Membuat Threads Dua cara dalam membuat threads: ◦Menurunkan Class Thread ◦Mengimplementasikan interface Runnable

16 Membuat turunan Class Thread 1 class PrintNameThread extends Thread { 2 PrintNameThread(String name) { 3 super(name); 4 start();//runs the thread once instantiated 5 } 6 public void run() { 7 String name = getName(); 8 for (int i = 0; i < 100; i++) { 9 System.out.print(name); 10 } 11 } 12 } 13 //bersambung

17 14 class TestThread { 15 public static void main(String args[]) { 16 PrintNameThread pnt1 = 17 new PrintNameThread("A"); 18 PrintNameThread pnt2 = 19 new PrintNameThread("B"); 20 PrintNameThread pnt3 = 21 new PrintNameThread("C"); 22 PrintNameThread pnt4 = 23 new PrintNameThread("D"); 24 } 25 } Membuat turunan Class Thread

18 Dapat memodifikasi method main seperti berikut ini: 14. class TestThread { 15. public static void main(String args[]) { 16. new PrintNameThread("A"); 17. new PrintNameThread("B"); 18. new PrintNameThread("C"); 19. new PrintNameThread("D"); 20. } 21. } Membuat turunan Class Thread

19 Contoh hasil: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABCDABCDABCDABCDABCDABCDABCDABCDABCDA BCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDAB CDABCDABCDABCDABCDABCDABCDABCDABCDBCDBCDBCD BCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDB CDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCD BCDBCDBCDBCD Membuat turunan Class Thread

20 Mengimplementasikan Interface Runnable Hanya membutuhkan implementasi dari method run ◦Bayangkanlah bahwa method run adalah method utama dari thread yang diciptakan Contoh: 1 class TestThread { 2 public static void main(String args[]) { 3 new PrintNameThread("A"); 4 new PrintNameThread("B"); 5 new PrintNameThread("C"); 6 new PrintNameThread("D"); 7 } 8 } 9 //bersambung...

21 Mengimplementasikan Interface Runnable 10. class PrintNameThread implements Runnable { 11. Thread thread; 12. PrintNameThread(String name) { 13. thread = new Thread(this, name); 14. thread.start(); 15. } 16. public void run() { 17. String name = thread.getName(); 18. for (int i = 0; i < 100; i++) { 19. System.out.print(name); 20. } 21. } 22. }

22 Extend vs. Implement Memilih salah satu dari kedua cara tersebut bukanlah sebuah permasalahan Implementasi interface Runnable ◦Menyebabkan lebih banyak pekerjaan karena kita harus  Mendeklarasikan sebuah object Thread  Memanggil method Thread pada object itu ◦Class Anda tetap dapat menjadi turunan dari class lain Menurunkan class Thread ◦Lebih mudah untuk diimplementasikan ◦Class Anda tidak dapat menjadi turunan dari class yang lainnya

23 Contoh: Method join Menyebabkan thread yang sedang bekerja saat ini menungggu sampai thread yang memanggil method ini selesai dieksekusi Contoh: 1 class PrintNameThread implements Runnable { 2 Thread thread; 3 PrintNameThread(String name) { 4 thread = new Thread(this, name); 5 thread.start(); 6 } 7 //bersambung

24 Contoh: Method join 8 public void run() { 9 String name = thread.getName(); 10 for (int i = 0; i < 100; i++) { 11 System.out.print(name); 12 } 13 } 14 } 15 class TestThread { 16 public static void main(String args[]) { 17 PrintNameThread pnt1 = new PrintNameThread("A"); 18 PrintNameThread pnt2 = new PrintNameThread("B"); 19 PrintNameThread pnt3 = new PrintNameThread("C"); 20 PrintNameThread pnt4 = new PrintNameThread("D"); 21 //bersambung...

25 Contoh: Method join 22 System.out.println("Running threads..."); 23 try { 24 pnt1.thread.join(); 25 pnt2.thread.join(); 26 pnt3.thread.join(); 27 pnt4.thread.join(); 28 } catch (InterruptedException ie) { 29 } 30 System.out.println("Threads killed."); 31 } 32 } 33 //mencoba untuk menghilangkan block catch yang ada

26 Sinkronisasi Mengapa menggunakan sinkronisasi threads? ◦Bagaimanapun juga sebuah thread yang berjalan bersama-sama kadang-kadang membutuhkan resource atau method dari luar ◦Butuh untuk berkomunikasi satu dengan yang lain sehingga dapat mengetahui status dan aktifitas mereka ◦Contoh: Permasalahan Produser-Konsumer

27 Sebuah contoh yang tidak disinkronisasi 1 class TwoStrings { 2 static void print(String str1, String str2) { 3 System.out.print(str1); 4 try { 5 Thread.sleep(500); 6 } catch (InterruptedException ie) { 7 } 8 System.out.println(str2); 9 } 10 } 11 //bersambung...

28 Sebuah contoh yang tidak disinkronisasi 12 class PrintStringsThread implements Runnable { 13 Thread thread; 14 String str1, str2; 15 PrintStringsThread(String str1, String str2) { 16 this.str1 = str1; 17 this.str2 = str2; 18 thread = new Thread(this); 19 thread.start(); 20 } 21 public void run() { 22 TwoStrings.print(str1, str2); 23 } 24 } 25 //bersambung...

29 Sebuah contoh yang tidak disinkronisasi 26 class TestThread { 27 public static void main(String args[]) { 28 new PrintStringsThread("Hello ", "there."); 29 new PrintStringsThread("How are ", "you?"); 30 new PrintStringsThread("Thank you ", 31 "very much!"); 32 } 33 }

30 Sebuah contoh yang tidak disinkronisasi Contoh hasil: Hello How are Thank you there. you? very much!

31 Sinkronisasi: Mengunci sebuah Object Mengunci sebuah object: ◦Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu ◦Java memperbolehkan penguncian terhadap sebuah object termasuk method-method-nya dengan menggunakan monitor  Object tersebut akan menjalankan sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil  Sekali object tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread yang akan mengakses object yang sama

32 Sinkronisasi: Mengunci sebuah Object Sinkronisasi sebuah method: ◦Menggunakan keyword synchronized  Dapat menjadi header dari pendefinisian method  Dapat mensinkronisasi object dimana method tersebut menjadi anggota dari synchronized ( ) { //statements yang akan disinkronisasikan }

33 Contoh Synchronized Pertama 1 class TwoStrings { 2 synchronized static void print(String str1, 3 String str2) { 4 System.out.print(str1); 5 try { 6 Thread.sleep(500); 7 } catch (InterruptedException ie) { 8 } 9 System.out.println(str2); 10 } 11 } 12 //bersambung...

34 Contoh Synchronized Pertama 13 class PrintStringsThread implements Runnable { 14 Thread thread; 15 String str1, str2; 16 PrintStringsThread(String str1, String str2) { 17 this.str1 = str1; 18 this.str2 = str2; 19 thread = new Thread(this); 20 thread.start(); 21 } 22 public void run() { 23 TwoStrings.print(str1, str2); 24 } 25 } 26 //bersambung...

35 Contoh Synchronized Pertama 27 class TestThread { 28 public static void main(String args[]) { 29 new PrintStringsThread("Hello ", "there."); 30 new PrintStringsThread("How are ", "you?"); 31 new PrintStringsThread("Thank you ", 32 "very much!"); 33 } 34 }

36 Contoh Synchronized Pertama Contoh Hasil: Hello there. How are you? Thank you very much!

37 Contoh Synchronized Kedua 1 class TwoStrings { 2 static void print(String str1, String str2) { 3 System.out.print(str1); 4 try { 5 Thread.sleep(500); 6 } catch (InterruptedException ie) { 7 } 8 System.out.println(str2); 9 } 10 } 11 //bersambung...

38 Contoh Synchronized Kedua 12 class PrintStringsThread implements Runnable { 13 Thread thread; 14 String str1, str2; 15 TwoStrings ts; 16 PrintStringsThread(String str1, String str2, 17 TwoStrings ts) { 18 this.str1 = str1; 19 this.str2 = str2; 20 this.ts = ts; 21 thread = new Thread(this); 22 thread.start(); 23 } 24 //bersambung...

39 Contoh Synchronized Kedua 25 public void run() { 26 synchronized (ts) { 27 ts.print(str1, str2); 28 } 29 } 30 } 31 class TestThread { 32 public static void main(String args[]) { 33 TwoStrings ts = new TwoStrings(); 34 new PrintStringsThread("Hello ", "there.", ts); 35 new PrintStringsThread("How are ", "you?", ts); 36 new PrintStringsThread("Thank you ", 37 "very much!", ts); 38 }}

40 Komunikasi Antar Thread: Methods Methods untuk komunikasi Interthread public final void wait() Menyebabkan thread ini menunggu sampai thread yang lain memanggil notify atau notifyAll method dari object ini. Hal ini dapat menyebabkan InterruptedException. public final void notify() Membangunkan thread yang telah memanggil method wait dari object yang sama. public final void notifyAll() Membangunkan semua thread yang telah memanggil method wait dari object yang sama.

41 Komunikasi Antar Thread

42 Contoh Produsen-Konsumen 1 class SharedData { 2 int data; 3 synchronized void set(int value) { 4 System.out.println("Generate " + value); 5 data = value; 6 } 7 synchronized int get() { 8 System.out.println("Get " + data); 9 return data; 10 } 11 } 12 //bersambung...

43 Contoh Produsen-Konsumen 13 class Producer implements Runnable { 14 SharedData sd; 15 Producer(SharedData sd) { 16 this.sd = sd; 17 new Thread(this, "Producer").start(); 18 } 19 public void run() { 20 for (int i = 0; i < 10; i++) { 21 sd.set((int)(Math.random()*100)); 22 } 23 } 24 } 25 //bersambung...

44 Contoh Produsen-Konsumen 26 class Consumer implements Runnable { 27 SharedData sd; 28 Consumer(SharedData sd) { 29 this.sd = sd; 30 new Thread(this, "Consumer").start(); 31 } 32 public void run() { 33 for (int i = 0; i < 10 ; i++) { 34 sd.get(); 35 } 36 } 37 } 38 //bersambung...

45 Contoh Produsen-Konsumen 39 class TestProducerConsumer { 40 public static void main(String args[]) 41 throws Exception { 42 SharedData sd = new SharedData(); 43 new Producer(sd); 44 new Consumer(sd); 45 } 46 }

46 Contoh Produsen-Konsumen Contoh hasil: Generate 8 Generate 45 Generate 52 Generate 65 Get 65 Generate 23 Get 23 Generate 49 Get 49 Generate 35 Get 35 Generate 39 Get 39 Generate 85 Get 85 Generate 35 Get 35

47 Contoh Produsen-Konsumen yang telah diperbaiki 1 class SharedData { 2 int data; 3 boolean valueSet = false; 4 synchronized void set(int value) { 5 if (valueSet) {//hanya dihasilkan jika mempumyai sebuah nilai 6 try { 7 wait(); 8 } catch (InterruptedException ie) { 9 } 10 } 11 //bersambung...

48 Contoh Produsen-Konsumen yang telah diperbaiki 12 System.out.println("Generate " + value); 13 data = value; 14 valueSet = true; 15 notify(); 16 } 17 //bersambung...

49 Contoh Produsen-Konsumen yang telah diperbaiki 18 synchronized int get() { 19 if (!valueSet) { 20 //producer belum memiliki suatu nilai 21 try { 22 wait(); 23 } catch (InterruptedException ie) { 24 } 25 } 26 //bersambung...

50 Contoh Produsen-Konsumen yang telah diperbaiki 26 System.out.println("Get " + data); 27 valueSet = false; 28 notify(); 29 return data; 30 } 31 } 32 /* Bagian kode tertentu tidak berubah. */

51 Contoh Produsen-Konsumen Contoh hasil: Generate 76 Get 76 Generate 25 Get 25 Generate 34 Get 34 Generate 84 Get 84 Generate 48 Get 48 Generate 29 Get 29 Generate 26 Get 26 Generate 86 Get 86 Generate 65 Get 65 Generate 38 Get 38 Generate 46 Get 46

52 Kemampuan Concurrency Dirilisi pada Java 2 SE 5.0 Dapat ditemukakn pada paket java.util.concurrent Interface ◦Executor ◦Callable

53 Interface Executor (BEFORE) Mengeksekusi Tugas-tugas Runnable: new Thread( ).start(); (AFTER) Mengeksekusi Tugas-tugas Runnable :.execute( );

54 Interface Executor Permasalahan dengan teknik yang lama: ◦Membuat Thread sangat mahal.  Membutuhkan pengaturan dan penumpukan di suatu tempat  Dapat mengakibatkan error pada memori  Solusi: ◦ Menggunakan pooling thread  Mengimplementasikan sebuah skema thread pooling dengan desain yang baik, tidaklah mudah dilakukan ◦Kesulitan untuk membatalkan atau mematikan sebuah thread

55 Interface Executor Solusi untuk permasalahan dengan teknik yang lama: ◦Menggunakan interface Executor  Decoupling task submission dari mechanic mengenai bagaimana setiap tugas dijalankan Mengggunakan interface Executor : Executor = ;.execute(new ());...

56 Interface Executor Membuat sebuah object dari tipe Executor: ◦Tidak dapat di-instantiate ◦Dapat membuat sebuah class yang mengimplementasikan interface ini ◦Dapat menggunakan factory method yang telah disediakan class Executor  Class Executors juga menyediakan factory method untuk me-manage thread pool sederhana

57 Executors Factory Methods Factory Method dari class Executor public static ExecutorService newCachedThreadPool() Menciptakan sebuah pool thread yang akan menciptakan thread sesuai yang dibutuhkan, atau ia akan menggunakan kembali thread yang telah dibangun sebelumnya, apabila tersedia. Sebuah method overloading, juga akan menggunakan object ThreadFactory sebagai argument. public static ExecutorService newFixedThreadPool(int nThreads) Menciptakan sebuah pool thread yang dapat digunakan kembali untuk membetulkan sebuah thread yang berada didalam antrian yang tidak teratur. Sebuah overloading method, akan menggunakan object ThreadFactory sebagai tambahan parameter. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) Menciptakan sebuah pool thread yang akan menjadwalkan command yang akan berjalan setelah diberikan sebuah delay, atau untuk mengeksekusi secara periodic. Sebuah overloading method, akan menggunakan object ThreadFactory sebagai tambahan parameter. public static ExecutorService newSingleThreadExecutor() Menciptakan sebuah Executor yang digunakan sebagai satu-satu-nya pelaksana dari sebuah antrian thread yang tidak teratur. Creates an Executor that uses a single worker thread operating off an unbounded queue. Sebuah overloading method, juga akan menggunakan object ThreadFactory sebagai tambahan parameter. public static ScheduledExecutorService newSingleThreadScheduledExecutor() Menciptakan sebuah Executor thread yang akan menjadwalkan command untuk dijalankan setelah delay tertentu, atau dieksekusi secara periodic. Sebuah overloading method, juga akan menggunakan object ThreadFactory sebagai tambahan parameter

58 Interface Executor Mengontrol eksekusi dan penyelesaian dari tugas-tugas Runnable Memberhentikan threads: executor.shutdown();

59 Interface Callable Mengingat kembali: ◦Dua cara dalam membuat threads:  Menurunkan ( Extend ) class Thread  Mengimplementasikan (implement) sebuah interface Runnable ◦Harus menjalankan method run public void run() //no throws clause Interface Callable ◦interface Runnable tanpa kelemahan- kelemahannya

60 Interface Callable (BEFORE) Mendapatkan hasil dari sebuah tugas Runnable: public MyRunnable implements Runnable { private int result = 0; public void run() {... result = someValue; } /* hasil attribut terlindung dari perubahan dari kode lain yang mengakses class ini*/ public int getResult() { return result; }

61 Interface Callable (AFTER) Mendapatkan hasil dari sebuah tugas Runnable : import java.util.concurrent.*; public class MyCallable implements Callable { public Integer call() throws java.io.IOException {... return someValue; }

62 Interface Callable Method call V call throws Exception dimana V adalah sebuah tipe generic. Fitur-fitur concurrency yang lain ◦J2SE 5.0 API documentation

63 Ringkasan Threads ◦Pengertian Thread ◦State dari Thread  Running  Ready to run  Resumed  Suspended  Blocked ◦Prioritas  Nilai integer dari angka 1 sampai dengan 10  Context switch

64 Ringkasan Class Thread ◦Constructor ◦Constants  MAX_PRIORITY  MIN_PRIORITY  NORM_PRIORITY ◦Methods  currentThread()  getName()  setName(String name)  getPriority()  isAlive() ● join([long millis, [int nanos]]) ● sleep(long millis) ● run() ● start()

65 Ringkasan Membuat Threads ◦Menurunkan Class Thread ◦Mengimplementasikan Interface Runnable ◦Extend vs. Implement Sinkronisasi ◦Mengunci sebuah Object ◦Keyword synchronized  Method header  Object

66 Ringkasan Komunikasi Antar Thread (Interthread) ◦Methods  wait  notify  notifyAll Kemampuan Concurrency ◦Interface Executor  Executors factory methods ◦Interface Callable


Download ppt "Pengenalan Pemrograman 2 Versi 2.0 Thread. Topik Pengertian Thread Dasar-dasar Thread ◦State dari Thread ◦Prioritas Class Thread ◦Constructor ◦Constants."

Presentasi serupa


Iklan oleh Google