Trang 97
Chng 4: LP TRÌNH A TUYN
I. Các kin thc liên quan
1. Tin trình ( process)
Tin trình là mt th hin ca mt chng trình ang x lý. S hu mt con tr
lnh, tp các thanh ghi và các bin. hoàn thành tác v ca mình, mt tin trình còn cn
n mt s tài nguyên khác nh: CPU, b nh, các tp tin, các thit b ngoi vi..
Cn phân bit c gia tin trình và chng trình. Mt chng trình là mt th hin th
ng, cha các ch thu khin máy tính thc hin mc ích gì ó; khi cho thc thi
ch th này thì chng trình s bin thành tin trình
Có th nói tóm tt tin trình là mt chng trình chy trên hu hành và c qun lý
thông qua mt s hiu gi là th
2. Tiu trình ( thread )
Mt tiu trình là mt n v x lý c bn trong h thng. Mi tiu trình x lý tun
t các n code ca nó, s hu mt con tr lnh, mt tp các thanh ghi và mt vùng nh
stack riêng, các tiu trình chia s CPU vi nhau ging nh cách chia s gia các tin trình.
Mt tin trình s hu nhiu tiu trình, tuy nhiên mt tiu trình ch có th thuc v mt tin
trình, các tiu trình bên trong cùng mt tin trình chia s nhau không gian a ch chung,
iu này có ngha là các tiu trình có th chia s nhau các bin toàn cc ca tin trình. Mt
tiu trình cng có th có các trng thái ging n các trng thái ca mt tin trình.
3. Hu hành n nhim, a nhim
Ø H n nhim là HH ch cho phép 1 tin trình chy ti mt thi m, ví d HH
DOS là HH n nhim.
Ø - H a nhim cho phép nhiu tin trình chy ti mt thi m, ví d HH
windows, Unix, Linux là các HH a nhim
Ø H a nhim u tiên: các tin trình c cp phát thi gian s dng CPU theo mc
u tiên khác nhau
Ø H a nhim không u tiên: các tin trình không có mc u tiên nào c, chúng “t
giác” nh quyn kim soát CPUsau khi kt thúc phn công vic
Chú ý: trong thc t mi máy thng ch có 1 CPU, nên không th có nhiu tin trình
chy ti mt thi m. Nên thông thng sa chng ch là gi lp. Chúng c gi lp
bng cách lu tr nhiu tin trình trong b nh ti mt thi im, và iu phi CPU qua
li gia các tin trình.
4. Các trng thái ca tin trình
Trng thái ca mt tin trình ti mt thi m c xác nh bi hot ng hin
thi ca tin trình ó. Trong quá trình sng mt tin trình thay i trng thái do nhiu
nguyên nhân nh: ht thi gian s dng CPU, phi ch mt s kin nào ó xy ra, hay
i mt thao tác nhp/xut hoàn tt…
Ti mt thi m mt tin trình có th nhn mt trong các trng thái sau ây:
1. To mi: tin trình ang c thành lp
2. Running: các ch th ca tin trình ang c x lý, hay nói cách khác tin trình
ang s hu CPU
3. Blocked: tin trình ang chc cp tài nguyên, hay ch mt s kin nào ó xy
ra
4. Ready: tin trình ang ch cp CPU x lý
5. Kt thúc: tin trình ã hoàn tt vic x lý
Trang 98
5. Min gng ( Critical Section )
a) Vn tranh chp tài nguyên
Ta xét tình hung sau:
Ø gi s A có 500$ trong tài khon ngân hàng
Ø A quyt nh rút ra 100$ t tài khon ngân hàng, thao tác ca A gm 2 bc:
1) ly ra 100$
2) gim s tài khon i 100$
Ø Tình hung gia 2 thao tác 1 và
2, B tr A 300$, do vy B cp
nht vào trong tài khon ca A là 800$ ( =500$ +300$), sau ó A tip tc công vic 2,
nó cp nht li trong tài khon là 400$, nh vy B ã tr A 300$, nhng A không nhn
c.
b) Min gng (Critical Section)
on chng trình trong ó có th xy ra các mâu thun truy xut trên tài nguyên
dng chung c gi là min gng ( Critical Section )
6. Khoá cht (deadlock)
Mt tp các tin trình c nh ngha là trong tình trng khoá cht nu nh, mi tin
trình trong tp hp u u chi mt s tài nguyên ang b nm gi bi các tin
trình khác, nh vy không có tin trình nào có th tip tc x lý, cng nh gii phóng
tài nguyên cho các tin trình khác s dng, tt c các tin trình trong tp hpu b
khoá vnh vin!.
II. Lp trình a tuyn trong Java
Vi Java ta có th xây dng các chong trình a lung. Mt ng dng có th bao gm
nhiu lung. Mi lung c gán mt công vic c th, chúng c thc thi ng thi vi
các lung khác.
Có hai cách to ra lung
Cách 1: To ra mt lp k tha t lp Thread và ghi è phng thc run ca lp
Thread nh sau:
class MyThread extends Thread{
public void run(){
//Mã lnh ca tuyn
}
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: To ra mt lp trin khai t giao din Runnable, ghi è phng thc run
class MyThread implements Runnable{
public void run(){
//Mã lnh ca tuyn
}
}
1. Lp Thread
Lp Thread cha phng thc to dng Thread() cng nh nhiu phng thc hu ích
có chc nng chy, khi ng, tm ngng, tip tc, gián n và ngng tuyn. to ra
và chy mt tuyn ta cn làm 2 bc:
Ø M rng lp Thread và Ghi è phng thc run()
Ø Gi phng thc start() bt u thc thi tuyn
Lp Thread không có nhiu phng thc lm, chúng ch có mt vài phng thc hu
dng c lit kê sau:
Ø public void run()
c java gi thc thi tuyn thi hành, bn phi ghi è phng thc này thc thi
nhim v ca tuyn, bi vì phng thc run()ca lp Thread ch là phng thc rng
Ø public void start()
khi ta to ra tuyn nó cha thc s chy cho n khi, phng thc start() c gi, khi
start() c gi thì phng thc run() cng c kích hot
Ø public void stop()
có chc nng ngng tuyn thi hành, phng thc này không an toàn, bn nên gán null
vào bin Thread dng tuyn, thay vì s dng phng thc stop()
Ø public void suspend()
Có chc nng tm ngng tuyn, trong java 2, phng thc này ít c s dng, bi vì
phng thc này không nh tài nguyên mà nó lm gi, do vy có th nguy c dn n
deadlock ( khoá cht ), bn nên dùng phng thc wait(), tm ngng tuyn thay vì
s dng phng thc suspend()
Ø public void resume()
Tip tc vn hành tuyn nu nh nó ang b ngng, nu tuyn ang thi hành thì
phng thc này b b qua, thông thng phng thc này c dùng kt hp vi
phng thc suspend(), k t java 2 phng thc này cùn vi phng thc suspend()b
t chi, do vy bn nên dùng phng thc notify () thay vì s dng phng thc
resume()
Ø public static void sleep( long millis) Threadows InterruptedException
t tuyn thi hành vào trng thái ng, trong khong thi gian xác nh bng mili giây.
chú ý sleep() là phng thc tnh.
Ø public void interrupt()
làm gián on tuyn thi hành
Ø public static boolean isInterrupt()
kim tra xem tuyn có b ngt không
Ø public void setpriority( int p)
n nh u tiên cho tuyn thi hành, u tiên c xác nh là mt s nguyên thuc
on [1,10]
Ø public final void wait() throws InterruptException
Trang 100
t tuyn vào trng thái ch mt tuyn khác, cho n khi có mt tuyn khác thông báo
thì nó li tip tc, ây là phng thc ca lp c s Object
Ø public final void notify ()
ánh thc tuyn ang ch, trên i tng này
Ø public final void notifyAll() ánh thc tt c các tuyn ang ch trên i tng này
Ø isAlive() Tr v True, nu lung là vn còn tn ti (sng)
Ø getPriority() Tr v mc u tiên ca lung
Ø join() i cho n khi lung kt thúc
Ø isDaemon() Kim tra nu lung là lung mt lung chy ngm (deamon)
Ø setDeamon(boolean on) ánh du lung nh là lung chy ngm
Ví d: Ta to ra 2 tuyn thi hành song song, mt tuyn thc hin vic in 200 dòng “i
hc s phm k thut Hng Yên”, trong khi tuyn này ang thc thi thì có mt tuyn khác
vn tip tc in 200 dòng ch “chào mng bn n vi 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 hc s phm k thut Hng Yên" );
}
}
class ChaoJV extends Thread{
public void run (){
for ( int i = 1; i <= 200; i++ )
System.out.println ( "chào mng bn n vi java" );
}
}
khi ta chy chng trình thy kt qu xen k nhau nh
………………..
i hc s phm k thut Hng Yên
i hc s phm k thut Hng Yên
chào mng bn n vi java
i hc s phm k thut Hng Yên
chào mng bn n vi java
i hc s phm k thut Hng Yên
chào mng bn n vi java
chào mng bn n vi java
…………...
Trang 101
2. Vòng i ca Thread
Hình sau th hin trng thái ca tuyn trong vòng i ca chúng
3. Lung chy ngm (deamon)
Mt chng trình Java kt thúc ch sau khi tt c các lung thc thi xong. Trong
Java có hai loi lung:
- Lung ngi s dng
- Lung chy ngm (deamon)
Ngi s dng to ra các lung ngi s dng, trong khi các lung deamon là các
lung chy nn. Lung deamon cung cp các dch v cho các lung khác. Máy o Java
thc hin tin trình thoát, khi ó ch còn duy nht lung deamon vn còn sng. Máy o
Java có ít nht mt lung deamon là lung “garbage collection” (thu m tài nguyên -
dn rác). Lung dn rác thc thi ch khi h thng không có tác v nào. Nó là mt lung có
quyn u tiên thp. Lp lung có hai phng thc làm vic vi lung deamon:
- public void setDaemon(boolean on)
- public boolean isDaemon()
4. Giao din Runnable
mc trc bn ã to ra các lung thc hin song song vi nhau, trong java ta
còn có th to ra các tuyn thi hành song song bng cách trin khai giao din Runnable.
Chc bn s t hi, ã có lp Thread ri ti sao li còn có giao din Runnable na, chúng
khác gì nhau?, câu tr li ch, java không h tr k tha bi, nu chng trình ca bn
va mun k tha t mt lp nào ó, li va mun a tuyn thì bn bt buc phi dùng
giao din Runnable, chng hn nh bn vit các Applet, bn va mun nó là Applet, li
va mun thc thi nhiu tuyn, thì bn va phi k tha t lp Applet, nhng nu ã k
tha t lp Applet ri, thì bn không th k tha t lp Thread na.
Ta vit li ví d trên, nhng ln này ta không k tha lp Thread, mà ta trin khai
giao din 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 ();
}