Presentation is loading. Please wait.

Presentation is loading. Please wait.

استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور 92214037 نیمسال دوم 93 برنامه نویسی همروند در جاوا Concurrent Programming in Java 1.

Similar presentations


Presentation on theme: "استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور 92214037 نیمسال دوم 93 برنامه نویسی همروند در جاوا Concurrent Programming in Java 1."— Presentation transcript:

1 استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور نیمسال دوم 93 برنامه نویسی همروند در جاوا Concurrent Programming in Java 1

2 2 عنوان مطالب  مفهوم نخ (thread) 3  برخی از مزایای استفاده از نخ (thread) 3  دیاگرام مربوط به حیاط یک thread 4  روش های ایجاد thread در جاوا 5 ارث بردن از کلاس Thread 6 پیاده سازی اینترفیس Runnable 7 استفاده از ExecuterService 8  برخی از توابع ، کلاس Thread 9  Daemon Thread 11  Class Callable 12  Synchronization 13 استفاده از Lock 14 استفاده از کلمه کلیدی Synchronized هنگام تعریف متد ( تابع ) 15 استفاده از Semaphore 16  CountDownLatch 17  CyclicBrarrier 18  پیوست ها 19

3 Multiple threads on multiple CPUs اجرای همزمان ،چندین کار به طور موازی => افزایش بهروری سیستم Multiple threads sharing a single CPU با وجود تنها یک پردازنده باز هم نخ ها مفیدند ( باعث افزایش زمان پاسخ می شوند.) مثلا هنگام نصب یک برنامه وجود یک گزینه برای انصراف از ادامه نصب ضروری است. )Cancel ( دکمه  مفهوم نخ (thread) : قطعه ای از کد است که می تواند به طور همزمان با نخ (thread) های دیگر به طور همزمان اجرا شود.  برخی از مزایای استفاده از نخ (thread) : 3

4 4  دیاگرام مربوط به حیاط یک thread : یک نخ Threaad از زمان ایجاد تا پایان کارش می تواند در حالات زیر قرار گیرد.

5 روش های ایجاد thread در جاوا 1. ارث بردن از کلاس Thread 2. پیاده سازی اینترفیس Runnable 3. استفاده از ExecuterService 5

6 class MyThread extends Thread { public void run() { // thread body of execution } Creating thread: MyThread thr1 = new MyThread(); Start Execution: thr1.start(); 1. ارث بردن از کلاس Thread 6

7 2 - پیاده سازی اینترفیس Runnable class ClassName implements Runnable {..... public void run() { // thread body of execution } Creating Object: ClassName myObject = new ClassName(); Creating Thread Object: Thread thr1 = new Thread( myObject ); Start Execution: thr1.start(); Thread ها یکبار مصرف اند. 7

8 3 - استفاده از ExecuterService import java.util.concurrent.*; class ClassName implements Runnable {..... public void run() { // thread body of execution } Creating Object: ClassName myObject = new ClassName(); Creating ExecutorService Object :(there are three ways to creating ExecutorServises) I.ExecutorService exe1= Executors.newCachedThreadPool(); II.ExecutorService exe2=Executors.newFixedThreadPool(number of Threads); III.ExecutorService exe3=Executors.newSingleThreadExecutor(); Start Execution: exe1.execute(); Terminate Execution: exe1.shutdown(); 8

9  برخی از توابع ، کلاس Thread : 9

10  Sleeping:  Thread.sleep(زمان برحسب میلی ثانیه);  TimeUnit.DAYS.sleep(timeout);  TimeUnit.HOURS.sleep(timeout);  TimeUnit.MINUTES.sleep(timeout);  setPriority : Thread t =new Thread(Runnable Object);  t.setPriority(newPriority); // 1<=newPriority<=10 and 10 is max priority  Yield :  Thread.yield();  Therad name :  Thread.currentThread().getName() //Returns this thread's name  برخی از توابع ، کلاس Thread : ( ادامه ) 10

11 Daemon Thread Thread ای که به محض به پایان رسیدن Thread Main ، خاتمه می یابد، چه کارش (Daemon Thread) به پایان رسیده باشد و چه نباشد. برای ساخت Daemon Thread کافی است یک Thread معمولی ساخته و خاصیت Daemon را برابر TRUE قرار دهیم. Thread t = new Thread(); t.setDaemon(True); 11

12 Class Callable زمانی که Thread باید نتیجه انجام کارش را به برنامه ایجاد کننده آن Thread ، باز گرداند. class ClassName implements Callable {..... public call() { // thread body of execution } Creating Callable Object : ClassName myObject = new ClassName(); Creating Thread Object: ExecutorService exe1= Executors.newCachedThreadPool(); Result : Future result = new Future Start Execution: result = exe1.submit(myObject); Using Result : result.get(); 12

13 Synchronization 1. استفاده از Lock 2. استفاده از کلمه کلیدی Synchronized هنگام تعریف متد ( تابع ) 3. استفاده از Semaphore 13

14 1.استفاده از Lock import java.util.concurrent.locks.*; Lock lock = new ReentrantLock(); try { lock.lock(); critical section } catch (Exception e) {} finally { lock.unlock(); } همواره سعی کنید که lock.unlock() ( آزاد سازی قفل ) را در بخش finally قرار دهید، چون این بخش همواره اجرا می شود. 14

15 2. استفاده از کلمه کلیدی Synchronized هنگام تعریف متد ( تابع ) synchronized void f() { /* body */ } is equivalent to void f() { synchronized(this) { /* body */ } } Class Mytask implements Runnable{ Puplic synchronized methode1(int sharedValue) { sharedValue ++; } Public void run(){ methode1(int sharedValue); } 15

16 3- استفاده از Semaphore : import java.util.concurrent.Semaphore; Semaphore s= new Semaphore(n, True/False) // Creates a Semaphore with the given number of permits and the given fairness setting Try{ s.aquire(); Critical section } catch (Exception e) {} s.release; 16

17 CountDownLatch برای همگام سازی Thread ها به کار می رود. Latch ها یکبار مصرف اند. دارای 2 متد زیر است : public void countDown(); // Decrements the count of the latch, releasing all waiting threads if the count reaches zero public void await() throws InterruptedException ; // Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted 17

18 CyclicBrarrier بر ا ی همگام سازی Thread ها به کار می رود. برخلاف Latch ها یکبار مصرف نیستند. دارای متد زیر است : public int await() throws InterruptedException ; BrokenBarrierException // Waits until all parties have invoked await on this barrier 18

19 19 پیوست ها مثالی از ارث بردن از کلاس Thread public class HelloThread extends Thread { public void run() { System.out.println(Thread.currentThread().getName()+" Say Hello "); } public static void main(String args[]) { HelloThread t0 = new HelloThread(); HelloThread t1 = new HelloThread(); t0.start(); t1.start(); }

20 20 مثالی از پیاده سازی اینترفیس Runnable public class HelloRunnable implements Runnable public void run() { System.out.println(Thread.currentThread().getName()+" Say Hello "); } public static void main(String args[]) { Thread t0=new Thread(new HelloRunnable()); Thread t1=new Thread(new HelloRunnable()); t0.start(); t1.start(); }

21 21 مثالی ازاستفاده از ExecuterService import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class HelloRunnable implements Runnable public void run() { System.out.println(Thread.currentThread().getName()+" Say Hello "); } public static void main(String args[]) { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { executorService.execute(new HelloRunnable()); } executorService.shutdown(); }

22 22 Daemon Thread مثالی از class MyThread extends public void run(){ System.out.println("Name: "+Thread.currentThread().getName()); System.out.println("Daemon: "+Thread.currentThread().isDaemon()); } public static void main(String[] args){ MyThread t1=new MyThread(); MyThread t2=new MyThread(); t1.setDaemon(true); t1.start(); t2.start(); }

23 23 Class Callable مثالی از import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class MyCallable implements Callable public String call() throws Exception { Thread.sleep(1000); //return the thread name executing this callable task return Thread.currentThread().getName(); } public static void main(String args[]) throws ExecutionException{ //Get ExecutorService from Executors utility class, thread pool size is 3 ExecutorService executor = Executors.newFixedThreadPool(3); //create a list to hold the Future object associated with Callable List > list = new ArrayList >(); //Create MyCallable instance Callable callable = new MyCallable(); for(int i=0; i< 7; i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable); //add Future to the list, we can get return value using Future list.add(future); } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console because Future.get() waits for task to get completed System.out.println(new Date()+ "::"+fut.get()); } catch (InterruptedException | ExecutionException e) {} }//shut down the executor service now executor.shutdown(); }

24 24 Synchronizationمثال هایی از  مثال اسلاید بعد نشان می دهد که اگر در برنامه نویسی همروند یا چند نخی که از منبع مشترک استفاده می کنند ، از تکنیک های synchronization همچون (Lock ،کلمه کلیدی Synchronized هنگام تعریف متد ( تابع ) و یا Semaphore) استفاده نکنیم،باعث احتمال بروز خطا در نتایج (race condition) می شود.  پس در ابتدا مثالی از یک برنامه همروند که از یک منبع مشترک (counter) استفاده می کنند بدون اعمال تکنیک های Synchronization زده می شود.سپس با تکنیک Lock و بعد از آن با تکنیک ” کلمه کلیدی “Synchronized مشکل ناحیه ی بحرانی بین نخ ها ی این برنامه را برطرف می کنیم.

25 25 Synchronizationمثالی بدون استفاده از class Counter { private int count; public void increment() { count++; } public void decrement() { count--; } public int getCount() { return count; } class Worker implements Runnable { private Counter counter; private boolean increment; private int count; public Worker(Counter counter, boolean increment, int count) { this.counter = counter; this.increment = increment; this.count = count; } public void run() { for (int i = 0; i < this.count; i++) { if (increment) { this.counter.increment(); } else { this.counter.decrement(); } public class LockExample { public static void main(String[] args) throws Exception { Counter counter = new Counter(); Thread t1 = new Thread(new Worker(counter, true, 10000)); t1.start(); Thread t2 = new Thread(new Worker(counter, false, 10000)); t2.start(); t1.join(); t2.join(); System.out.println("Final count: " + counter.getCount()); } خطا چون مقدار Final count باید مساوی صفر(0) شود.

26 26 مثالی ازLock همان مثال قبلی فقط کافی است کلاس Counter این اسلاید را با کلاس Counter اسلاید قبل ( اسلاید 25 ) جایگزین کنید. همچنین کتابخانه های import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; را به ابتدای برنمه اضافه نمایید. حال مشاهده می کنید که مقدار Final count همان طور که انتظار می رفت برابر صفر ( 0 ) شده. class Counter { private int count; private Lock lock = new ReentrantLock(); public void increment() { try { lock.lock(); count++; } finally { lock.unlock(); } public void decrement() { try { lock.lock(); count--; } finally { lock.unlock(); } public int getCount() { return count; }

27 27 مثالی از استفاده از کلمه کلیدی synchronized همان مثال قبلی فقط کافی است کلاس Counter این اسلاید را با کلاس Counter اسلاید 25 جایگزین کنید. حال مشاهده می کنید که مقدار Final count همان طور که انتظار می رفت برابر صفر ( 0 ) شده. class Counter { private int count; synchronized public void increment() { count++; } synchronized public void decrement() { count--; } public int getCount() { return count; }

28 28 CountDownLatchمثالی از import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Task implements Runnable{ private static int count=0; private final int id = count++; private CountDownLatch latch ; public Task(CountDownLatch l){ latch=l; public void run() { try { Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(Task.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Task :"+id); latch.countDown(); } } در این مثال ، یک کلاس Task ، یک کلاس Waiter و یک کلاس CountDownLatchExample( همان کلاس اصلی ( داریم. روند کار : در متد main از کلاس CountDownLatchExample سه عدد شی از کلاس Task و یک شی از کلاس Waiter به طور همروند اجرا می کنیم. هدف : تا کار تمام Task ها تمام نشده ، نخ مربوط به شی کلاس Waiter باید منتظر بماند.

29 29 ادامهCountDownLatchمثالی از import java.util.concurrent.CountDownLatch; import java.util.logging.Level; import java.util.logging.Logger; public class Waiter implements Runnable{ private static int count=0; private final int id = count++; private CountDownLatch latch ; public Waiter(CountDownLatch l){ latch=l; public void run() { try { latch.await(); Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(Waiter.class.getName()).log(Level.SEV ERE, null, ex); } System.out.println("Waiter :"+id); }

30 30 ادامهCountDownLatchمثالی از import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownLatchExample { public static void main(String[] args) { // TODO code application logic here ExecutorService exec=Executors.newCachedThreadPool(); CountDownLatch l= new CountDownLatch(3); exec.execute(new Waiter(l)); for (int i = 0; i < 3; i++) { exec.execute(new Task(l)); } exec.shutdown(); }

31 31 import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.logging.Level; import java.util.logging.Logger; public class BeforeAdd implements Runnable{ int []array; static int count=0; private final int id=count++; private CyclicBarrier barrier; public BeforeAdd(int []a, CyclicBarrier b){ array = a; barrier = public void run() { for (int i =id*10; i < (id+1)*10; i++) { array[i]=id+100; try { Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(BeforeAdd.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println("BeforeAdd "+id+" Ended"); try { barrier.await(); } catch (InterruptedException ex) { Logger.getLogger(BeforeAdd.class.getName()).log(Level.SEVERE, null, ex); } catch (BrokenBarrierException ex) { Logger.getLogger(BeforeAdd.class.getName()).log(Level.SEVERE, null, ex); } CyclicBrarrierمثالی از در این مثال ، یک کلاس BeforeAdd ، یک کلاس AfterAdd و یک کلاس CyclicBarrierExample( همان کلاس اصلی ( داریم. روند کار : در متد main از کلاس CyclicBarrierExample ده (10) عدد شی از کلاس BeforeAdd و یک شی از کلاس AfterAdd به طور همروند اجرا می کنیم. آرایه a به طول 100 را به 10 قسمت مساوی تقسیم کرده و هر یک از این 10 قسمت را به یکی از اشیا BeforeAdd داده تا محتوای هر خانه از آن قسمت را با عدد 100 جمع کند. سپس توسط شی AfterAdd مقادیر آرایه چاپ شود. هدف : تا کار تمام 10 نخ مربوط به کلاس BeforeAdd تمام نشده ، نخ مربوط به شی AfterAdd باید منتظر بماند و نباید اجرا شود.

32 32 ادامهCyclicBrarrierمثالی از import java.util.concurrent.CyclicBarrier; import java.util.logging.Level; import java.util.logging.Logger; public class AfterAdd implements Runnable{ int []array; static int count=0; private final int id=count++; public AfterAdd(int []a){ array = a; public void run() { for (int i = 0; i < array.length; i++) { System.out.println(array[i]+","); try { Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(AfterAdd.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("AfterAdd :"+id+" Ended"); }

33 33 import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CyclicBarrierExample { /** args the command line arguments */ public static void main(String[] args) { // TODO code application logic here int []a =new int[100]; ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < a.length; i++) { a[i]=i; } CyclicBarrier b=new CyclicBarrier(10, new AfterAdd(a)); for (int i = 0; i < 10; i++) { exec.execute(new BeforeAdd(a, b)); } ادامهCyclicBrarrierمثالی از

34 34


Download ppt "استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور 92214037 نیمسال دوم 93 برنامه نویسی همروند در جاوا Concurrent Programming in Java 1."

Similar presentations


Ads by Google