علوم مهندسی کامپیوتر و IT و اینترنت

برنامه نویسی همروند در جاوا (Concurrent Programming in Java)

barname_nevisiye_hamrod_dar_java

در نمایش آنلاین پاورپوینت، ممکن است بعضی علائم، اعداد و حتی فونت‌ها به خوبی نمایش داده نشود. این مشکل در فایل اصلی پاورپوینت وجود ندارد.




  • جزئیات
  • امتیاز و نظرات
  • متن پاورپوینت

امتیاز

درحال ارسال
امتیاز کاربر [0 رای]

نقد و بررسی ها

هیچ نظری برای این پاورپوینت نوشته نشده است.

اولین کسی باشید که نظری می نویسد “برنامه نویسی همروند در جاوا (Concurrent Programming in Java)”

برنامه نویسی همروند در جاوا (Concurrent Programming in Java)

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

اسلاید 2: 2عنوان مطالب مفهوم نخ (thread) 3 برخی از مزایای استفاده از نخ (thread) 3 دیاگرام مربوط به حیاط یک thread 4 روش های ایجاد thread در جاوا 5 ارث بردن از کلاس Thread 6 پیاده سازی اینترفیس Runnable 7 استفاده از ExecuterService 8 برخی از توابع ، کلاسThread 9Daemon Thread 11Class Callable 12Synchronization 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 در جاواارث بردن از کلاس Thread پیاده سازی اینترفیس Runnable 3. استفاده از ExecuterService5

اسلاید 6: class MyThread extends Thread { public void run() { // thread body of execution } }Creating thread: MyThread thr1 = new MyThread();Start Execution: thr1.start();ارث بردن از کلاس 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- استفاده از ExecuterServiceimport 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();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 priorityYield :Thread.yield();Therad name :Thread.currentThread().getName() //Returns this threads nameبرخی از توابع ، کلاس Thread : (ادامه) 10

اسلاید 11: Daemon ThreadThread ای که به محض به پایان رسیدن 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<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();12

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

اسلاید 14: استفاده از 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 settingTry{ 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 zeropublic void await() throws InterruptedException; //Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted17

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

اسلاید 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 { @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: 21مثالی ازاستفاده از ExecuterServiceimport 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: 22Daemon 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: 23Class 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(); }}

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

اسلاید 25: 25Synchronizationمثالی بدون استفاده از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: 28CountDownLatchمثالی از 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(); } }در این مثال ، یک کلاس 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; } @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); } }

اسلاید 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: 31import 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); 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; } @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); } }

اسلاید 33: 33import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierExample { /** * @param 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

29,000 تومان

خرید پاورپوینت توسط کلیه کارت‌های شتاب امکان‌پذیر است و بلافاصله پس از خرید، لینک دانلود پاورپوینت در اختیار شما قرار خواهد گرفت.

در صورت عدم رضایت سفارش برگشت و وجه به حساب شما برگشت داده خواهد شد.

در صورت نیاز با شماره 09353405883 در واتساپ، ایتا و روبیکا تماس بگیرید.

افزودن به سبد خرید