Tải bản đầy đủ (.pdf) (7 trang)

Lập trình đa tuyến

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (349.26 KB, 7 trang )

Trang 97
Chng 4: LP TRÌNH A TUYN
I. Các kin thc liên quan
1. Tin trình ( process)
Tin trình là mt th hin ca mt chng trình ang x lý. S hu mt con tr
lnh, tp các thanh ghi và các bin.  hoàn thành tác v ca mình, mt tin trình còn cn
n mt s tài nguyên khác nh: CPU, b nh, các tp tin, các thit b ngoi vi..
Cn phân bit c gia tin trình và chng trình. Mt chng trình là mt th hin th
ng, cha các ch thu khin máy tính  thc hin mc ích gì ó; khi cho thc thi
ch th này thì chng trình s bin thành tin trình
Có th nói tóm tt tin trình là mt chng trình chy trên hu hành và c qun lý
thông qua mt s hiu gi là th
2. Tiu trình ( thread )
Mt tiu trình là mt n v x lý c bn trong h thng. Mi tiu trình x lý tun
t các n code ca nó, s hu mt con tr lnh, mt tp các thanh ghi và mt vùng nh
stack riêng, các tiu trình chia s CPU vi nhau ging nh cách chia s gia các tin trình.
Mt tin trình s hu nhiu tiu trình, tuy nhiên mt tiu trình ch có th thuc v mt tin
trình, các tiu trình bên trong cùng mt tin trình chia s nhau không gian a ch chung,
iu này có ngha là các tiu trình có th chia s nhau các bin toàn cc ca tin trình. Mt
tiu trình cng có th có các trng thái ging n các trng thái ca mt tin trình.
3. Hu hành n nhim, a nhim
Ø H n nhim là HH ch cho phép 1 tin trình chy ti mt thi m, ví d HH
DOS là HH n nhim.
Ø - H a nhim cho phép nhiu tin trình chy ti mt thi m, ví d HH
windows, Unix, Linux là các HH a nhim
Ø H a nhim u tiên: các tin trình c cp phát thi gian s dng CPU theo mc
u tiên khác nhau
Ø H a nhim không u tiên: các tin trình không có mc u tiên nào c, chúng “t
giác” nh quyn kim soát CPUsau khi kt thúc phn công vic
Chú ý: trong thc t mi máy thng ch có 1 CPU, nên không th có nhiu tin trình
chy ti mt thi m. Nên thông thng sa chng ch là gi lp. Chúng c gi lp


bng cách lu tr nhiu tin trình trong b nh ti mt thi im, và iu phi CPU qua
li gia các tin trình.
4. Các trng thái ca tin trình
Trng thái ca mt tin trình ti mt thi m c xác nh bi hot ng hin
thi ca tin trình ó. Trong quá trình sng mt tin trình thay i trng thái do nhiu
nguyên nhân nh: ht thi gian s dng CPU, phi ch mt s kin nào ó xy ra, hay
i mt thao tác nhp/xut hoàn tt…
Ti mt thi m mt tin trình có th nhn mt trong các trng thái sau ây:
1. To mi: tin trình ang c thành lp
2. Running: các ch th ca tin trình ang c x lý, hay nói cách khác tin trình
ang s hu CPU
3. Blocked: tin trình ang chc cp tài nguyên, hay ch mt s kin nào ó xy
ra
4. Ready: tin trình ang ch cp CPU  x lý
5. Kt thúc: tin trình ã hoàn tt vic x lý
Trang 98
5. Min gng ( Critical Section )
a) Vn  tranh chp tài nguyên
Ta xét tình hung sau:
Ø gi s A có 500$ trong tài khon ngân hàng
Ø A quyt nh rút ra 100$ t tài khon ngân hàng, thao tác ca A gm 2 bc:
1) ly ra 100$
2) gim s tài khon i 100$
Ø Tình hung gia 2 thao tác 1 và
2, B tr A 300$, do vy B cp
nht vào trong tài khon ca A là 800$ ( =500$ +300$), sau ó A tip tc công vic 2,
nó cp nht li trong tài khon là 400$, nh vy B ã tr A 300$, nhng A không nhn
c.
b) Min gng (Critical Section)
on chng trình trong ó có th xy ra các mâu thun truy xut trên tài nguyên

dng chung c gi là min gng ( Critical Section )
6. Khoá cht (deadlock)
Mt tp các tin trình c nh ngha là  trong tình trng khoá cht nu nh, mi tin
trình trong tp hp u u chi mt s tài nguyên ang b nm gi bi các tin
trình khác, nh vy không có tin trình nào có th tip tc x lý, cng nh gii phóng
tài nguyên cho các tin trình khác s dng, tt c các tin trình trong tp hpu b
khoá vnh vin!.
II. Lp trình a tuyn trong Java
Vi Java ta có th xây dng các chong trình a lung. Mt ng dng có th bao gm
nhiu lung. Mi lung c gán mt công vic c th, chúng c thc thi ng thi vi
các lung khác.
Có hai cách  to ra lung
Cách 1: To ra mt lp k tha t lp Thread và ghi è phng thc run ca lp
Thread nh sau:
class MyThread extends Thread{
public void run(){
//Mã lnh ca tuyn
}
Míi t¹o KÕt thóc
RunningReady
Blocked
S¬ ®å chuyÓn tr¹ng th¸i cña mét tiÕn tr×nh
A
500
$
1
2 500-
50
Trang 99
}

Cách 2: To ra mt lp trin khai t giao din Runnable, ghi è phng thc run
class MyThread implements Runnable{
public void run(){
//Mã lnh ca tuyn
}
}
1. Lp Thread
Lp Thread cha phng thc to dng Thread() cng nh nhiu phng thc hu ích
có chc nng chy, khi ng, tm ngng, tip tc, gián n và ngng tuyn.  to ra
và chy mt tuyn ta cn làm 2 bc:
Ø M rng lp Thread và Ghi è phng thc run()
Ø Gi phng thc start()  bt u thc thi tuyn
Lp Thread không có nhiu phng thc lm, chúng ch có mt vài phng thc hu
dng c lit kê sau:
Ø public void run()
c java gi  thc thi tuyn thi hành, bn phi ghi è phng thc này  thc thi
nhim v ca tuyn, bi vì phng thc run()ca lp Thread ch là phng thc rng
Ø public void start()
khi ta to ra tuyn nó cha thc s chy cho n khi, phng thc start() c gi, khi
start() c gi thì phng thc run() cng c kích hot
Ø public void stop()
có chc nng ngng tuyn thi hành, phng thc này không an toàn, bn nên gán null
vào bin Thread  dng tuyn, thay vì s dng phng thc stop()
Ø public void suspend()
Có chc nng tm ngng tuyn, trong java 2, phng thc này ít c s dng, bi vì
phng thc này không nh tài nguyên mà nó lm gi, do vy có th nguy c dn n
deadlock ( khoá cht ), bn nên dùng phng thc wait(),  tm ngng tuyn thay vì
s dng phng thc suspend()
Ø public void resume()
Tip tc vn hành tuyn nu nh nó ang b ngng, nu tuyn ang thi hành thì

phng thc này b b qua, thông thng phng thc này c dùng kt hp vi
phng thc suspend(), k t java 2 phng thc này cùn vi phng thc suspend()b
t chi, do vy bn nên dùng phng thc notify () thay vì s dng phng thc
resume()
Ø public static void sleep( long millis) Threadows InterruptedException
t tuyn thi hành vào trng thái ng, trong khong thi gian xác nh bng mili giây.
chú ý sleep() là phng thc tnh.
Ø public void interrupt()
làm gián on tuyn thi hành
Ø public static boolean isInterrupt()
kim tra xem tuyn có b ngt không
Ø public void setpriority( int p)
n nh  u tiên cho tuyn thi hành,  u tiên c xác nh là mt s nguyên thuc
on [1,10]
Ø public final void wait() throws InterruptException
Trang 100
t tuyn vào trng thái ch mt tuyn khác, cho n khi có mt tuyn khác thông báo
thì nó li tip tc, ây là phng thc ca lp c s Object
Ø public final void notify ()
ánh thc tuyn ang ch, trên i tng này
Ø public final void notifyAll() ánh thc tt c các tuyn ang ch trên i tng này
Ø isAlive() Tr v True, nu lung là vn còn tn ti (sng)
Ø getPriority() Tr v mc u tiên ca lung
Ø join() i cho n khi lung kt thúc
Ø isDaemon() Kim tra nu lung là lung mt lung chy ngm (deamon)
Ø setDeamon(boolean on) ánh du lung nh là lung chy ngm
Ví d: Ta to ra 2 tuyn thi hành song song, mt tuyn thc hin vic in 200 dòng “i
hc s phm k thut Hng Yên”, trong khi tuyn này ang thc thi thì có mt tuyn khác
vn tip tc in 200 dòng ch “chào mng bn n vi java”
public class Hello{

public static void main ( String[] args ){
new ChaoDH ().start ();
new ChaoJV ().start ();
}
}
class ChaoDH extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "i hc s phm k thut Hng Yên" );
}
}
class ChaoJV extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "chào mng bn n vi java" );
}
}
khi ta chy chng trình thy kt qu xen k nhau nh
………………..
i hc s phm k thut Hng Yên
i hc s phm k thut Hng Yên
chào mng bn n vi java
i hc s phm k thut Hng Yên
chào mng bn n vi java
i hc s phm k thut Hng Yên
chào mng bn n vi java
chào mng bn n vi java
…………...
Trang 101
2. Vòng i ca Thread

Hình sau th hin trng thái ca tuyn trong vòng i ca chúng
3. Lung chy ngm (deamon)
Mt chng trình Java kt thúc ch sau khi tt c các lung thc thi xong. Trong
Java có hai loi lung:
- Lung ngi s dng
- Lung chy ngm (deamon)
Ngi s dng to ra các lung ngi s dng, trong khi các lung deamon là các
lung chy nn. Lung deamon cung cp các dch v cho các lung khác. Máy o Java
thc hin tin trình thoát, khi ó ch còn duy nht lung deamon vn còn sng. Máy o
Java có ít nht mt lung deamon là lung “garbage collection” (thu m tài nguyên -
dn rác). Lung dn rác thc thi ch khi h thng không có tác v nào. Nó là mt lung có
quyn u tiên thp. Lp lung có hai phng thc  làm vic vi lung deamon:
- public void setDaemon(boolean on)
- public boolean isDaemon()
4. Giao din Runnable
 mc trc bn ã to ra các lung thc hin song song vi nhau, trong java ta
còn có th to ra các tuyn thi hành song song bng cách trin khai giao din Runnable.
Chc bn s t hi, ã có lp Thread ri ti sao li còn có giao din Runnable na, chúng
khác gì nhau?, câu tr li  ch, java không h tr k tha bi, nu chng trình ca bn
va mun k tha t mt lp nào ó, li va mun a tuyn thì bn bt buc phi dùng
giao din Runnable, chng hn nh bn vit các Applet, bn va mun nó là Applet, li
va mun thc thi nhiu tuyn, thì bn va phi k tha t lp Applet, nhng nu ã k
tha t lp Applet ri, thì bn không th k tha t lp Thread na.
Ta vit li ví d trên, nhng ln này ta không k tha lp Thread, mà ta trin khai
giao din Runnable
public class Hello{
public static void main ( String[] args ){
Thread t = new Thread ( new ChaoDH () );
t.start ();
Thread t1 = new Thread ( new ChaoJV () );

t1.start ();
}

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×