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

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

صفحه 1:
بسم‌اللّه الرحمن‌الحیم و تس هم روند د رخاوا 7 نت 7 ‎Osea‏ نسم استاد : آقای دکتر جاویدان ارائه دهنده : محمد حسین چراغی پور 1۹۱۱۳۵۳۷ نیمسال دوم ‎٩۳‏

صفحه 2:
© © © © > هه هه 2 44 ٍ عنوان مطالب منهوم نخ (لعس) برخی از مزایای استفاده از نخ ‎dered)‏ ‏اكرام در بوط به حياط بك لصيية ‎6٠‏ ‏روش های ایجاد م۸ در جاوا ارث بردن از كلاس © پیاده سازی اینترفیس ۳ استفاده از © برخی از توايع . كلاس ‎Deewerd‏ 9 ‎Thread‏ مه عد04 ‎ae Oks‏ هام5 6 استفاده از سرا ‎ae‏ ‏استفاده از كلمه كليدى لح واصحب9)هنكام تعريف متد(تابع) ‎١8‏ ‏استفاده از عبلچسوق 6 هسوسو ‎aw‏ ‏هه 6 ۲ پیوست ها 4 2

صفحه 3:
*** مفهوم نخ (1376301]): قطعه ای از کد است که می ‎wiley‏ به طور همزمان با نخ ‎dered)‏ هاى ديكر به طور همزمان اجرا شود. * برخی از مزایای استفاده از نخ ‎(thread)‏ : + 1۳1 > 1۳2 طور موازی -> افزایش > 33 بهروری سیستم ‎Dulipe trees ohartay 3 ok‏ + حب سس 1 ‎OPO Thread‏ ات0 ماس لاوما ‎Thread > O% complete Gs‏ يك يردازنده باز هم تخ فیدند (باعث زمان باس هل ]| می‌شوند») مثلاهنگام نصب یک ‎Mette‏ © برنامه وجود یک گزینه برای انصراف .از ادامه نصب ضروری است دکم) اسهم(

صفحه 4:
** دیاگرام مربوط به حیاط یک ‎thread‏ : ۷ یک نخ 1176880 از زمان ایجاد تا پایان کارش می تواند در حالات زیر قرار گیرد. 2۲1و ‎ready) Time expired! [ ۲‏ ‎‘ime expired) 1‏ ‎interrupted suspend() 1‏ - ‎notify() ;‏ ‎blocked )‏ ( ۱ ۲ ‎ee \ dispatch 1‏ ‎١ sleep() 2 0‏ ‎wait() suspend() | 7‏ ‎running =‏ ‎completion‏ stop() |, (

صفحه 5:
روش های ایجاد 17680 در جاوا 4 ارث بردن از كلاس 11216201" ۲ _پیاده سازی اینترفیس 16طهصص1 ۳ استفاده از ‎ExecuterService‏

صفحه 6:
1 ارث بردن از کلاس ‎Thread‏ class MyThread extends Thread { public void run() { // thread body of execution 1 1 © Orediog treat MyThread thri1 = new MyThread(); * ‏وق‎ Cxevution: thri.start();

صفحه 7:
2- پیاده سازی اینترفیس ‎Runnable‏ class ClassName implements Runnable public void run() // thread body of execution } 1 ال 0 ClassName myObject = new ClassName(); 6 Diced Obect Thread ۲۳۳1 = new Thread( myObject ); Grad Exerution: thri.start(); ۷ ۵۵ ها ی کبار مصرفاند.

صفحه 8:
3- استفاده از 6۲۳7106 ]ماه مد 1 class ClassName implements Runnable public void run() // thread body of execution :سای ‎ClassName myObject = new ClassName();‏ ‎Crxttery Bxerutor Service Obert (hore ore tree ways ty oreuten: Oxo uo Services)‏ ‎I. ExecutorService exel= Executors.newCachedThreadPool();‏ ‎II.ExecutorService exe2=Executors.newFixedThreadPool(number of Threads) ;‏ ‎III.ExecutorService exe3=Executors.newSingleThreadExecutor() ;‏ ‎Gtat Cxevuicd:‏ exel.execute(); erwinite Exeruicn: exel.shutdown();

صفحه 9:
** برخی از توابع , کلاس 1۵30 : Creates a default thread Creates a threadfor a specified task. Starts the thread that causes the run() method to be invoked by the JVM. Tests whether the thread is currently running. Sets priority p (ranging from 1 to 10) for this thread. ‘Waits for this thread to finish. Puts the runnable object to sleep for a specified time in milliseconds. Causes this thread to temporarily pause and allow other threads to execute. Interrupts this thread. java lang. Thread +Thread() + Thread(task: Runnable) H+start(): void HisAlive(): boolean + setPrionty(p: int): void +join(): vad I+sleep(millis: long): void +yield(): void +intemupt(): void

صفحه 10:
** برخى از توابع . كلاس 1128624 : (ادامه) * ‏سات‎ ‏:(زمانب رحسبمیلیث انیه)ساه لمجا‎ [۱ strep (tert); ‏تس‎ VOORG. sey teoer); PreeDut. DIDOTEG. shop (terns); ‏یی‎ سر )م۱۳ مد ۱ لبط ‎OD te wos priory‏ جم (00 كرو سيت > ‎teetPrioty(ceudPriony); I‏ ey : Dh. cured Moead().e(Dawe() [| Returce his thread's care

صفحه 11:
Daemon Thread ‎Tread‏ لموكه به محضيه يايازيسيدن»7) 4ح!7/ خلتمه مىيابد جه كارش يلوح ه!1 ددح 9) به بايازيسيدم باشدو جه نباشد ‏۲ برای ساخت اج(" مب كافى است یک ۳۷( معمولی ساخته و خاصیت مس را برابر ۳030۵ قرار دهیم. ‎Dread! = ew Phread();‏ ‎te(Daewoa(Prue);

صفحه 12:
Class Callable زمانی که لح باید نتیجه انجام کارش را به برنامه ایجاد کننده آن اج . باز گرداند. class ClassName implements Callable<T> ic <T> call() // thread body of execution ‏در‎ 1 سا 02 بسن ClassName myObject = new ClassName(); Oreutay Thread ‏تال‎ ExecutorService exel= Executors.newCachedThreadPool (); Result > (Puture<T> result = cow Pures D> Gro Cxerutios: rep = excl aboot Ober); Oring Revd: :()اعن ها

صفحه 13:
Synchronization Lock ‏استفاده از‎ ١ ‏استفاده از كلمه كليدى ل واصمر©)هنكام تعریف متد(تابع)‎ .۲ ۳. استفاده از و6

صفحه 14:
1 استفاده از ‎Lock‏ ‎Vv‏ همواره سعی کنید که اسطسبس) (آزاد سازی قفل ) را در بخش مت( قرار دهید. چون این بخش همواره اجرا وتو ‎

صفحه 15:
۲. استفاده از کلمه کلیدی ‎plaSynchronized‏ تعریف متد(تابع) ‎P() { ۳ books *7}‏ لس اسرد ‎fe exnardet‏ ‎vend P() { srehvoctzed(his) {/* bony 1}‏ ‎Chess Dytark teoplecrrais urate‏ ‎weber it shoredOcke)‏ ارو ‎phe‏ ‏{ ‏} ‏)اج ‎Pb‏ ‏:ص0 ساد )لاسي } ‎} ‏;++ له( )سود ‎

صفحه 16:
3- استفاده از سوه : )اجه دمم موز يي م ل ل 000 تمك .5(): مهمد له ) («مسسه6) je reba

صفحه 17:
CountDownLatch ‏برای همگام سازی لو( ها به کار می رود.‎ ”“ ‏ااها ی کبار مصرفلند‎ : ‏دارای ۲ متد زیر است‎ Y prble vod pountDownl); //Decreweuts the covet oF the hick, releustog dl uwvatey reas Bike cost ‏امد موم‎ pably vod awat() rows TeerruptedBxcepton; [Ours he current thread i wat ved he kick kas counted dowa ty zero, weiss the PAM_barer save, 3) 23 } ‘rouse

صفحه 18:
برای همگام سازی لح" ها به کار می رود. ۲ برخلاف ابا ها یکبار مصرف نیستند. : ‏دارای متد زیر است‎ partes have keoked ava on hey borer ) } CyclicBrarrier Publy tot await) feos hier ptedBxcepton; Broken Barrier Paceptics //Dety al ll L ۳۱۵ ‏مم‎ ‎Proceed Procons ‏مر‎ ‏سور‎ ممه يده

صفحه 19:
Thread ‏مثالی از ارث بردن از کلاس‎ prblic class Wel Phread extras Thread { abe ved rm) { ‏که )ون مور‎ Phrew().ceKDawe()#" Gay Leto "); } ) (زاسسه حدق ع ‎okt td‏ ماطح ‎(D = ew ek/Phrewn();‏ لججموا! !سايلا ‎cow ek/Dhrecnl();‏ = 1( امس ساسا لك :)د.ا } ‎pplication9 (run)‏ 9 ‘Thread-1 Say Hello Thread-0 Say Hello [ | sorzp successrox (cotal time: 0 seconds)

صفحه 20:
181111112116 ‏مثالی از پیاده سازی اینترفیس‎ public class HelloRunnable implements Runnable { @Override public void run() { Oyptew.ou. pride Mreud.cureaDreud().ce(Dore()+" Gay ells"); x public static void main(String args[]) { Thread t0=new Thread(new HelloRunnable()); Threud (l=uew Thread(new HelloRunnable()); +0.start(); t1.start(); 1 Output - JavaApplications (run) ‎Teread-t Sey Hetto‏ | و ‎Thread-0 Say Hello‏ ‎suru successrut (roel time: 0 seconds)‏ | ۳ ‎a ‎ ‎ ‎ ‎

صفحه 21:
مثالی ازاستفاده از ‎ExecuterService‏ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class HelloRunnable implements Runnable { @Override public void run() { System.out.printIn(Thread.currentThread().getName()+" Say Hello "); t 7 public static void main(String ‏([]ذوعة‎ ) ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { executorService.execute(new HelloRunnable()); 1 executorService.shutdown(); Output - JavaApplication9 (run) 3> t WD) == } [jp | Pootcicehread-2 Say Helio BUILD SUCCESSFUL (total time: 0 seconds)

صفحه 22:
Daemon Thread jt. class MyThread extends Thread{ @Override public void run(){ System.out.println("Name: "+Thread.currentThread().getName()); System.out.printIn("Daemon: "+Thread.currentThread().isDaemon()); t public static void main(String[] args){ MyThread t1=new MyThread(); MyThread t2=new MyThread(); t1.setDaemon(true); tl.start(); t2.start(); 1 7 Output - JavaApplication9 (run) x Daemon: true BUILD SUCCESSFUL (total time: 2 0 ۶ i 1 0 seconds)

صفحه 23:
‘import java.util ArrayList; import java.util Date {import java.util List; Import Java.util concurrent.Callabl; import java.util. concurrent ExecutionException; Class Callable jj1t. import java.util cmeurrent ExecutorService: {import java.util.comeurrent Executors; ‏نو‎ x] 0 Import Java-ut.coneurrent Future, ea lepers public class MyCallable implements Callable<String> { ‏بسد از‎ @Override jp, Mn ee 09 iste ‏مد هد‎ public String call() throws Exception { ‏و‎ aieaasac gumrannte Thread.sleep(1000); So x Uireturn the thread name executing this callable task ‏عه بعد جو لي د‎ return Thread.currentThread().getName(); om on. d2 AB AS-IS TRENT } Yon Jun 09 11:48:16 THOT 2014 public static void main(String args[]) throws ExecutionExc Yea Sun 08 11-48-1¢ Teor 14: NGet ExecutorService from Executors utility class, thread pool sizi won fur 09 11:49:26 IOI Z2L4:4 ExecutorService executor = Executors.newFixedThread iereate 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. printin(new Date()+ "::"+fut.get()); } catch (InterruptedException | ExecutionException e) {} }//shut down the executor service now executorshutdown();

صفحه 24:
| Synchronization jLulJ_is مثال اسلاید بعد نشان می دهد که اگر در برنامه نویسی همروند یا چند نخی که از منبع مشترک استفاده می کنند . از تکنیک های مطادتدم امه همجون (كادمرا .كلمه كليدى ادص واصصر8)هنكام تعريف متد(تابع) و يا «طاصحمح8) استفاده نكنيم.باعث احتمال بروز خطا در نتایج (مطفسس عصصامی شود. ۶ پس در ابتدا مثالی از یک برنامه همروند که از یک منبع مشترک(عحح) استفاده می کنند بدون اعمال تکنیک های «صدت د واصحر8) زده مى شود.سيس با تكنيك جاوما و بعد از آن با تكنيك” كلمه كليدى “لص واصصر8) مشكل ناحيه ى بحرانی بین نج ها اين برنامه را برطرف فى كنيع

صفحه 25:
مثا لاب دونلستفادم از صهمناهعتمم هو public class LockExample { public static void main(String{] args) throws Exception { 1 Counter counter = new Counter(); ‘Thread ti = new Thread(new Worker(counter, true, public void decrement() { 10000)), tlistart(); > Thread 2 = new Thread(new Worker(counter, false, 10000((: public int getCount() { 12istart); return count; > t1joind; > 12join0; ‏موه مهم ملس مالس اولس سم‎ ٩ ‏روصم‎ ‎fate Counter counter; } ۷ خطا چون مقدار م47 بايد مساوى صفر(0) شود. Output - JavaApplicstion9 (run) > 27 BUILD SUCCESSFUL (total time: 0 seconds) Final count SEY Y| public Worker(Counter counter, boolean increment, int count) { class Counter { private int count; public void increment() { count++; private int count; this.counter this.increment + public void run() { for (int i = 0; i < this.count; i++) { if (increment) { this.counter:increment(); + else { this.counter.decrement(); 1

صفحه 26:
class Counter { ‏مثالی از1001‎ private int count; ” همان مثال قبلى فقط كافى است كلاس -دعح0 اين اسلايد ‎private Lock lock = new ReentrantLock();‏ ‎OS ۷ 9‏ بت قبل (اسلاید25) جایگزین کنید. { ‎public void increment)‏ همچنین کتابخانه های { ‎try‏ ‏ار وا اجه موز او ‎lock lock();‏ ‎ ‏لج و سا محوجه ممصو أ وم موی ‎count++;‏ ‏را به ابتدای برتعه اضافه تمایید. / ‎finally { lock.unlock(); 1 1 ‎ ‏” حال مشاهده مى كنيد كه مقدار عدج 4*) همان طور كه انتظار مى رفت برابر صغومويروروون زهت ‎lic‏ ‏(0)شده. { ‎try‏ ‎Jock.lock(); ‎count--; ‎finally { lock.unlock(); 1 ‎1 ‎ ‎‘Output -JaveApplication® (run) x public int getCount() { ‏اه‎ = return count; Final court: 0 ‎BUILD SUCCESSFUL (total time: 0 seconds) ‎ ‎bb ‎0 ‎ea ‎ ‎ ‎

صفحه 27:
ل آز استفاده از ‎synchronized .saJdS aolS‏ ” همان مثال قبلى فقط كافى است كلاس ع0 اين اسلايد را با كلاس فعح0 اسلايذ25جايكزين كنيد. ا ۳ synchronized public void increment() { count++; t chronized public void decrement() { count--; 5 t public int getCount() { return count; t ۷ حال مشاهده می کنید که مقدار امجه 4 همان طور که انتظار می رفت برابر صفر (0)شده. 1 Output - JavaApplication9 (run) % yp | ‏ه تعصيمه تمعدة‎ BUILD succES: م

صفحه 28:
CountDownLatch LL ۲ در این مثال , يى كلاس ۳ , یک کلاس ه03 و يى كلاس :0 اصرایه 0 (همان کلاس اصلی( داریم. ۷ روند کار:در متد هت از کلاس ‎aw Onmi@rwebuchBanope‏ عدد شی از کلاس ‎Nak‏ و یک شی از كلاس ف به طور همروتد ا كك ۷ هدف : تا کار تمام ۰۴ ها تمام نشده , نخ مربوط به شی کلاس جع( باید منتظر بماند. Loner ‏رم ,060 ۵) ساب )مه( اه )مسا‎ ex); جات اسه 0ه 0 ‎edt.‏ جوم ص اك ميم بو 1 ی ‎Bxer tors‏ سوم شم و( rable ches Pook eoplecrrais (Rucrrcblet Private tai ‏:0ص با‎ private Prof tat id = cuctt+; Private CountDrudak back 5 publ Dask( Ort Dourdcick If DVrrewl.sker(CO); } otc (eter upteKB rept ex) { } Gyotew mt prictha( "Dash :"+d); kick contour);

صفحه 29:
aels!CountDownLatch5l ‏ثالى‎ 0 وا )متس اه )ناس سرا ‎puoi oar edt. Ort Dewdatck;‏ او ‏امابوا نم او ‏اما دمم او ‏ای سا بط( حاه عاطم :)اجه لا صااه ‎Private‏ ‎price Prod tot td = cova +; ‎private Count Drudaick hacks 5 ‎prbhe Deter (CouctDrwelatch I){ ‎nl, ex); } Gypstew.cut.pricta("Daiter :"+id); } 1

صفحه 30:
aolsICountDownLatch 5! Jk ‏اه راتکه ن) و دمم ارو‎ koport jad. courses. ‏ال‎ ‎/ ‏)مه دم او‎ | pablo ches Opua Dowd ‏]تلوس ا‎ pubhe static void aia((Stricra[] axe) { ۱۱۱۳۵۵۵ ‏مزا شاوی طلیی‎ ‏ی‎ eakPoo ‏ام روط م6‎ IF ‏)وراه( تنج‎ (: egw eu ner): Por (hati = O51 <9; r+) { Seren (Se TSH) exev.shutdowa(); 2 ‎rum) |‏ سس ‎SUCCESSFUL (total time: 0 seconds) ‎

صفحه 31:
1 import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; CyclicBrarrier;LLi. import java.util.logging. Level; ‘import java.util.logging.Logger; WS SL, gDPerDekd ‏در اين مثال , يى كلاس 8944 يى كلاس‎ ” “) public class BeforeAdd 0 Ru ‎yuS gles) Ove Darter(Brnrpe‏ اصلى( داريم. ۲ روند کار؛در متد > از كلاس ‎Op BarerBmnpe‏ 02 )226(10 ‎| int [Jarray; static int count private final int i ‎ ‎‘count++; ‏شی از کلاس!۱۰۱۵) و یک شی از کلاس ۲0۳۲۷60۵4 به طور همروند ‎private CyclicBarrier barrier;‏ ‎public BeforeAdd(int []a, CyclicBarri: ‏کنیم.‎ wo Lol array = a; barrier = b;} ۲ ‏آرایه » به طول 100 را به 10 قسمت مساوی تقسیم کرده و هر یک از اين ‎@Override‏ ‏0 قسمت را به یکی از اشیا ‎0:۵٩‏ داده تا محتوا: خانه از آ { ‎public void run()‏ ‎a‏ > مكتوات فر 2015 2 0 ‏قسمت را با عدد100 جمع کند.سپس توسط شی ۳۳(۵۱() مقادیر آرایه چاپ ‎arrayli]=id+100;‏ ‏شود. { ‎try‏ ‎Thread.sleep(20); eae‏ ‏۲ هدف؟؛ تا کار تمام 10 تخ مربوط به کلاس 0:41 تمام نشده , تج ‎catch (InterruptedException e « ogi.‏ } ‎Logger.getLogger(BeforeAdd.ck ‏و تاد ار شور‎ ley sus lor oa ) ‏ا ا‎ ‎System.out.printIn("BeforeAdd "+id+" Ended"); try { barrierawait(); } 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);

صفحه 32:
import java.util.concurrent.CyclicBarrier; import java.util.logging.Level; aolsICyclicBrarrier jl ‏الى‎ ‎import java.util. logging. Logger; public class AfterAdd implements Runnable{ int [Jarray; 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.printin(arrayli]+ try { Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(AfterAdd.class.getName()).log(Level.S EVERE, null, ex); 1 + System.out.printIn("AfterAdd :"+id+" Ended"); } }

صفحه 33:
import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; aolsICyclicBrarrier jl ‏الى‎ ‎import java.util.concurrent.Executors; public class CyclicBarrierExample { pee * @param args the command line arguments 4 public static void main(String] args) { // TODO code application logic here int [Ja =new int[100]; ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < a.length; i++) { ali] 1 CyclicBarrier b=new CyclicBarrier(10, new AfterAdd(a)); for (int i = 0; i < 10; i++) { exec.execute(new BeforeAdd(a, b)); 1 t 3

صفحه 34:

جهت مطالعه ادامه متن، فایل را دریافت نمایید.
29,000 تومان