صفحه 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: