کامپیوتر و 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:

1 برنامه نویسی همروند در جاوا ‏Concurrent Programming in Java استاد :آقای دکتر جاویدان ارائه دهنده :محمد حسین چراغی پور 92214037 نیمسال دوم93 عنوان مطالب مفهوم نخ () thread 3 برخی از مزایای استفاده از نخ () thread 3 4 دیاگرام مربوط به حیاط یک thread روش های ایجاد threadدر جاوا 5 ‏Thread ارث بردن از کالس 6 ‏Runnable پیاده سازی اینترفیس 7 ‏ExecuterService استفاده از 8 برخی از توابع ،کالس Thread 9 ‏Daemon Thread  11 12 ‏Class Callable  ‏Synchronization  13 استفاده از Lock 14 استفاده از کلمه کلیدی Synchronizedهنگام تعریف متد(تابع) استفاده از Semaphore 16 ‏CountDownLatch  17 ‏CyclicBrarrier  18 پیوست ها 19 15 2 مفهوم نخ ( : )threadقطعه ای از کد است که می تواند به طور همزمان با نخ ( )threadهای دیگر به طور همزمان اجرا شود. 3 برخی از مزایای استفاده از نخ (: )thread ‏Thread 1 ‏Thread 2 ‏Thread 3 ‏Thread 1 ‏Thread 2 ‏Thread 3 ‏Multiple threads on multiple ‏CPUs اجرای همزمان ،چندین کار به طور موازی => افزایش بهروری سیستم ‏Multiple threads sharing a single ‏CPU با وجود تنها یک پردازنده باز هم نخ ها مفیدند (باعث افزایش زمان پاسخ می شوند ).مثال هنگام نصب یک برنامه وجود یک گزینه برای انصراف .از ادامه نصب ضروری است دWکWمه( )Cancel دیاگرام مربوط به حیاط یک : thread 4 یک نخ Threaadاز زمان ایجاد تا پایان کارش می تواند در حاالت زیر قرار گیرد. روش های ایجاد threadدر جاوا .1ارث بردن از کالس Thread .2پیاده سازی اینترفیس Runnable .3استفاده از ExecuterService 5 Thread ارث بردن از کالس.1 6 class MyThread extends Thread { public void run() { // thread body of execution } } • Creating thread: MyThread thr1 = new MyThread(); • Start Execution: thr1.start(); Runnable پیاده سازی اینترفیس-2 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  ExecuterService استفاده از-3 8 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(); برخی از توابع ،کالس: Thread 9 ) (ادامه: Thread کالس، برخی از توابع 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 11 Daemon Thread WیدهWسWایانرWWه پWW) بDaemon ThreadW(شWارWWه کW چ،ابدWییWمه مWاتW خ،Thread MainیدنWسWایانرWWه پWWحضبWه مWWه بWWیکW اThread  .باشدWWه نWاشد و چWWب . قرار دهیمTRUE را برابرDaemon معمولی ساخته و خاصیتThread کافی است یکDaemon Thread برای ساخت Thread t = new Thread(); t.setDaemon(True); Class Callable . باز گرداند، Thread باید نتیجه انجام کارش را به برنامه ایجاد کننده آنThread زمانی که 12 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(); Synchronization .1استفاده از Lock .2استفاده از کلمه کلیدی Synchronizedهنگام تعریف متد(تابع) .3استفاده از Semaphore 13 Lock استفاده از.1 14 ;*.import java.util.concurrent.locks ;)(Lock lock = new ReentrantLock { try ;)(lock.lock critical section }{ catch (Exception e) } { finally ;)(lock.unlock } چون این بخش همواره اجرا، قرار دهیدfinally () (آزاد سازی قفل ) را در بخشlock.unlock همواره سعی کنید که .می شود هنگام تعریفSynchronized استفاده از کلمه کلیدی.2 )متد(تابع 15 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); } } : Semaphore استفاده از-3 16 ;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 CountDownLatch 17 . ها به کار می رودThread برای همگام سازی .ندWصرفW ا کبار مW ها ی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 CyclicBrarrier 18 . ها به کار می رودThread برای همگام سازی . ها یکبار مصرف نیستندLatch برخالف : دارای متد زیر است public int await() throws InterruptedException; BrokenBarrierException //Waits until all parties have invoked await on this barrier پیوست ها Thread مثالی از ارث بردن از کالس 19 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(); } } Runnable مثالی از پیاده سازی اینترفیس 20 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لیازWثاWم 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 import import import import import import import import java.util.ArrayList; java.util.Date; java.util.List; java.util.concurrent.Callable; java.util.concurrent.ExecutionException; java.util.concurrent.ExecutorService; java.util.concurrent.Executors; java.util.concurrent.Future; Class CallableلیازWثاWم 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(); های(یازSynchronization م(ثا((ل مثال اسالید بعد نشان می دهد که اگر در برنامه نویسی همروند یا چند نخی که از منبع مشترک استفاده می کنند ،از تکنیک های synchronizationهمچون (، Lockکلمه کلیدی Synchronizedهنگام تعریف متد(تابع) و یا )Semaphoreاستفاده نکنیم،باعث احتمال بروز خطا در نتایج ()race conditionمی شود. پس در ابتدا مثالی از یک برنامه همروند که از یک منبع مشترک( )counterاستفاده می کنند بدون اعمال تکنیک های Synchronizationزده می شود.سپس با تکنیک Lockو بعد از آن با تکنیک” کلمه کلیدی “ Synchronizedمشکل ناحیه ی بحرانی بین نخ ها ی این برنامه را برطرف می کنیم. 24 class Counter { private int count; public void increment() { count++; } 25 public void decrement() { count--; } public int getCount() { return count; } 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()); } 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(); } } } } باید مساویFinal count خطا چون مقدار .) شود0(صفر 26 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; } } Lockمثالی از این اسالیدCounter همان مثال قبلی فقط کافی است کالس .) جایگزین کنید25 اسالید قبل(اسالیدCounter را با کالس همچنین کتابخانه های ;import java.util.concurrent.locks.Lock ;import java.util.concurrent.locks.ReentrantLock .را به ابتدای برنمه اضافه نمایید همان طور که انتظار می رفت برابرFinal count حال مشاهده می کنید که مقدار .)شده0( synchronized ی از استفاده از کلمه کلیدی 27 class Counter { private int count; این اسالیدCounter همان مثال قبلی فقط کافی است کالس .جایگزین کنید25 اسالیدCounter را با کالس synchronized public void increment() { count++; } synchronized public void decrement() { count--; } همان طور که انتظار می رفت برابر صفرFinal count حال مشاهده می کنید که مقدار .)شده0( public int getCount() { return count; } } 28 import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Task implements Runnable{ CountDownLatchم(ثا((لیاز و یک کالسWaiter یک کالس، Task یک کالس، در این مثال .(همان کالس اصلی( داریمCountDownLatchExample private static int count=0; private final int id = count++; سهCountDownLatchExample از کالسmain در متد: روند کار private CountDownLatch latch ; به طورWaiter و یک شی از کالسTask عدد شی از کالس public Task(CountDownLatch l){ latch=l; .همروند اجرا می کنیم } نخ مربوط به شی کالس، ها تمام نشدهTask تا کار تمام: هدف @Override public void run() { . باید منتظر بماندWaiter try { Thread.sleep(20); } catch (InterruptedException ex) { Logger.getLogger(Task.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Task :"+id); latch.countDown(); } } 29 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ثالی از ادامهCountDownLatchثالی از 30 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 import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; CyclicBrarrierم(ثا((لیاز import java.util.logging.Level; import java.util.logging.Logger; و یک کالسAfterAdd یک کالس،BeforeAdd یک کالس، در این مثال public class BeforeAdd implements Runnable{ .(همان کالس اصلی( داریمCyclicBarrierExample int []array; static int count=0; )عدد10( دهCyclicBarrierExample از کالسmain در متد: روند کار private final int id=count++; به طور همروندAfterAdd و یک شی از کالسBeforeAddشی از کالس private CyclicBarrier barrier; public BeforeAdd(int []a, CyclicBarrier b){ .اجرا می کنیم array = a; barrier = b;} قسمت مساوی تقسیم کرده و هر یک از این10 را به100 به طولa آرایه @Override public void run() { داده تا محتوای هر خانه از آنBeforeAdd قسمت را به یکی از اشیا10 for (int i =id*10; i < (id+1)*10; i++) { مقادیر آرایه چاپAfterAdd سپس توسط شی. جمع کند100قسمت را با عدد array[i]=id+100; try { .شود Thread.sleep(20); } catch (InterruptedException ex) نخ مربوط به، تمام نشدهBeforeAdd نخ مربوط به کالس10 تا کار تمام: هدف { Logger.getLogger(BeforeAdd.class.getName()).log(Level.SEVERE, ex); } بایدAfterAdd شی .نباید اجرا شودnull, بماند و منتظر } 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); } 32 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.S EVERE, null, ex); } } System.out.println("AfterAdd :"+id+" Ended"); } } ادامهCyclicBrarrierثالی از 33 import 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 با تشکر از توجه شما

51,000 تومان