Presentation is loading. Please wait.

Presentation is loading. Please wait.

استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور

Similar presentations


Presentation on theme: "استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور"— Presentation transcript:

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

2 عنوان مطالب مفهوم نخ (thread) 3
پیاده سازی اینترفیس Runnable استفاده از ExecuterService برخی از توابع ، کلاسThread Daemon Thread Class Callable Synchronization استفاده از Lock استفاده از کلمه کلیدی Synchronizedهنگام تعریف متد(تابع) استفاده از Semaphore CountDownLatch CyclicBrarrier پیوست ها

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

4 دیاگرام مربوط به حیاط یک thread :
یک نخ Threaad از زمان ایجاد تا پایان کارش می تواند در حالات زیر قرار گیرد. WAITING A thread that is waiting indefi nitely for another thread to perform a particular action is in this state.

5 روش های ایجاد thread در جاوا
پیاده سازی اینترفیس Runnable 3. استفاده از ExecuterService

6 class MyThread extends Thread { public void run()
// thread body of execution } Creating thread: MyThread thr1 = new MyThread(); Start Execution: thr1.start();

7 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 ها یکبار مصرف اند.

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) ExecutorService exe1= Executors.newCachedThreadPool(); ExecutorService exe2=Executors.newFixedThreadPool(number of Threads); ExecutorService exe3=Executors.newSingleThreadExecutor(); Start Execution: exe1.execute(); Terminate Execution: exe1.shutdown(); public static ExecutorService newCachedThreadPool() Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available ///////////////////////////// The threads in the pool will exist until it is explicitly shutdown. ///////////////////////////////////////////////////////////////

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

10 برخی از توابع ، کلاس Thread : (ادامه)
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.MIN_PRIORITY; Thread.MAX_PRIORITY; Thread.NORM_PRIORITY;

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

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

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

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

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);

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;

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

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

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 مثالی از پیاده سازی اینترفیس Runnable
public class HelloRunnable implements Runnable { @Override 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 مثالی ازاستفاده از ExecuterService
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class HelloRunnable implements Runnable { @Override 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 Daemon Threadمثالی از class MyThread extends Thread{ @Override 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 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<String> { @Override 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<Future<String>> list = new ArrayList<Future<String>>(); //Create MyCallable instance Callable<String> callable = new MyCallable(); for(int i=0; i< 7; i++){ //submit Callable tasks to be executed by thread pool Future<String> future = executor.submit(callable); //add Future to the list, we can get return value using Future list.add(future); for(Future<String> 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(); Class Callableمثالی از

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

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

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 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; } @Override 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(); CountDownLatchمثالی از در این مثال ، یک کلاس Task ، یک کلاس Waiter و یک کلاس CountDownLatchExample(همان کلاس اصلی( داریم. روند کار:در متد main از کلاس CountDownLatchExample سه عدد شی از کلاس Task و یک شی از کلاس Waiter به طور همروند اجرا می کنیم. هدف : تا کار تمام Task ها تمام نشده ، نخ مربوط به شی کلاس Waiter باید منتظر بماند.

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; } @Override public void run() { try { latch.await(); Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(Waiter.class.getName()).log(Level.SEVERE, null, ex); System.out.println("Waiter :"+id); ادامهCountDownLatchمثالی از

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 CyclicBrarrierمثالی از
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 = b;} @Override 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"); 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 ادامه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; } @Override 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"); ادامهCyclicBrarrierمثالی از

33 ادامهCyclicBrarrierمثالی از
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 با تشکر از توجه شما


Download ppt "استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور"

Similar presentations


Ads by Google