http://www.ebook.edu.vn
Chương 4
Lp trình đa tuyến đon
1. Tng quan
Khi thc hin mt công vic phc tp người ta thường chia công vic ra thành nhiu
phn và giao công vic cho nhiu người cùng thc hin, điu này giúp cho công vic được
tiến hành nhanh chóng. Các ng dng phn mm s dng mt chiến lược tương t được
gi là đa tuyến đon để chia nh các tác v thành các đơn v d qun lý. Lp trình đa tuyến
đon là mt khái nim quan trng trong lp trình mng bng Java vì các client và server
thường phi thc hin mt s tác v đồng thi ti cùng mt thi đim (ví d lng nghe các
yêu cu và đáp ng các yêu cu, x lý d liu và cp nht giao din đồ ha người dùng).
Trước khi đi vào tìm hiu lp trình đa tuyến đon trong Java, ta cn hiu rõ s khác nhau
gia lp trình đơn tuyến đon, lp trình đa tiến trình và lp trình đa tuyến đon.
1.1. Lp trình đơn tuyến đon
Khái nim đa tuyến đon là khái nim khó đối vi nhng người mi bt đầu làm quen.
Rt nhiu ngôn ng lp trình h điu hành trước đây không h tr đa tuyến đon.
Phn mm truyn thng được viết bng các ngôn ng th tc được biên dch thành
mt khuôn dng mà máy có th hiu được gi là mã máy. B x lý trung tâm đọc mã này
x lý các lnh theo cu trúc tun t hết lnh này đến lnh tiếp theo. Thi gian thc hin các
lnh có th thay đổi tùy thuc vào bn cht ca các lnh.
Ưu đim chính ca kiu lp trình này là tính đơn gin ca nó. Nếu mt lnh không
hoàn thành thì lnh tiếp theo s không được x lý. Điu này nghĩa là người lp trình có th
d đoán trng thái ca máy ti bt k thi đim nào cho trước.
1.2. Lp trình đa tiến trình
Đa nhim là kh năng ca mt h điu hành máy tính chy nhiu chương trình đồng
thi trên mt CPU. Điu này đưc thc hin bng cách chuyn hot động t mt chương
trình này sang chương trình khác tương đối nhanh để to cho người s dng cm giác tt
c các chương trình đang được xđồng thi. Có hai kiu đa nhim:
Đa nhim ưu tiên. Trong đa nhim ưu tiên, h điu hành xác định cách phân b các
thi gian ca CPU cho tng chương trình. Cui mi khong thi gian mà CPU phân
b, chương trình hin đang hot động buc phi tr quyn điu khin cho h điu
hành, dù nó có mun hay không. Các ví d v h điu hành h đa nhim ưu tiên
Unix, Windows 95/98, Windows NT.
Đa nhim hp tác. Trong đa nhim hp tác, mi chương trình kim soát mt phn
thi gian CPU mà nó cn. Điu này nghĩa là mt chương trình phi hp tác để trao
quyn điu khin cho các chương trình khác, nếu không nó s chiếm dng CPU. Các
h điu hành đa nhim hp tác là Windows 3.1 và Mac OS 8.5.
Nhng ai đã quen lp trình trên h thng Unix hn là đã quen vi khái nim lp trình
đa tiến trình. Để h tr đa nhim, Unix s dng khái nim các tiến trình. Mi ng dng đang
chy là mt tiến trình, vi b nh được phân b cho chương trình và d liu. Có nhiu tiến
trình chy trên cùng mt máy. H điu hành s phân b thi gian cho tng tiến trình, dng
tiến trình khi hết thi gian và cho phép tiến trình khác tiếp tc. Đôi khi, mt tiến trình b phong
ta hoc có th t chn để giành thi gian CPU.
Lp trình đa tiến trình có các li ích khác. Các chương trình t chúng có th to ra các
tiến trình mi , mt phn chương trình thc hin mt tác v trong khi mt phn khác thc
hin công vic khác. Ví d, khi đang kim tra email trên mt máy xa, giao din người dùng
có th hin th din tiến ca thao tác và cho phép người dùng son tho các thông đip và
đọc các thông đip đã đưc ti v trước đó.
Mc dù lp trình đa tiến trình hot động tt, nhưng nó vn có nhng nhược đim.
Trước hết, khi mt tiến trình phân nhánh thành hai tiến trình, s dn đến s chng chéo gia
http://www.ebook.edu.vn
vic lưu tr d liu ca tiến trình này vi tiến trình khác. Mi tiến trình cn có mt bn sao
d liu ca riêng nó, vì vy nếu có nhiu tiến trình thì s cn nhiu b nh. Th hai là không
có cách nào để mt tiến trình truy xut và sa đổi d liu ca mt tiến trình khác.
1.3. Lp trình đa tuyến đon
Đa tuyến đon m rng khái nim đa nhim bng cách cho phép mt chương trình
thc hin mt sc v đồng thi. Mi tác v được xem như là mt tuyến đon và nó có mt
lung điu khin riêng. Đa tuyến đon rt hu ích trong các ng dng thc tế. Ví d, nếu
quá trình np mt trang web vào trình duyt quá lâu, người s dng cn phi có kh năng
ngt vic np trang web đó bng cách n nút lnh stop. Giao din người dùng có th tiếp tc
đáp ng các yêu cu ca người dùng bng cách s dng mt tuyến đon riêng cho hot
động np trang web.
Để lp trình đa tuyến đon ta cn có mt cách nhìn nhn v phn mm khác. Ngoài
vic x lý tun t, các tác v còn có th được xđồng thi-nghĩa là, nhiu tác v được
thc hin cùng mt lúc mà không cn đợi tác v này hoàn thành mi tiến hành tác v khác.
Đa tuyến đon còn có nghĩa là nhiu tuyến x lý, cho phép mt chương trình có nhiu th
hin cùng hot động, cùng s dng chung b nh. Mt ng dng có th thc hin nhiu tác
v đồng thi và các tuyến đon có th truy xut ti các biến d liu dùng chung để cùng làm
vic hp tác vi nhau.
Nếu máy tính ch có mt CPU, thì ch có mt tuyến đon đang chy ti mt thi đim
cho trước. H điu hành duy trì mt hàng đợi các tuyến đon và phân b thi gian CPU cho
chúng. Tuy nhiên, thi gian phân b thi gian cho mt tuyến đon là công bng trong nhiu
tình hung, vì nó ngăn các tuyến đon khác thc hin công vic. (tình trng này còn được
gi là đói tuyến đon). Ta cn phi có mt cách nào đó để phân b thi gian CPU giành cho
mi tuyến đon là như nhau.
Mc đích ca tiến trình và tuyến đon đều là cho phép nhiu máy tính thc hin
nhiu tác v đồng thi.
Ví d: A là mt tài khon ti ngân hàng. Phương thc getBalance(): ly ra giá tr ca
tài khon. Phương thc setBalance(): chép li giá tr vào bn ghi tài khon. Xét ví d tuyến
đon dưới đây
Hình 4.1
a=A.getBalance();
a+=deposit;
A.setBalance(a);
http://www.ebook.edu.vn
Hình 4.2
Đa tuyến đon (Multi-thread)
Mt ng dng có th có nhiu tuyến đon. Kh năng làm vic vi nhiu tuyến đon
được gi là đa tuyến đon. Đa tuyến đon cho phép bn viết các chương trình hiu qu tn
dng ti đa CPU bng cách duy trì thi gian tr là ti thiu.
Ti cùng mt thi đim có hai khách hàng cùng ghi vào cùng mt tài khon. Nếu thc
hin như vy thì ch có tuyến đon th hai mi thc s nh hưởng ti tài khon, kết qu ca
giao dch th nht s b mt. Để khc phc điu này cn có mt cơ chế để thông báo mt
đối tượng đang được s dng hay không.
Vòng đời ca mt tuyến đon
Mt tuyến đon có th mt trong bn trng thái sau trong sut vòng đời ca nó:
new-Mt tuyến đon mi là mt tuyến đon được to ra bng cách s dng toán t
new nhưng vn chưa được khi động.
runnable-Mt tuyến đon trng thái runnable mi khi phương thc start() ca nó
được kích hot. Điu này nghĩa là mã lnh trong phương thc run() có th được x
lý bt k khi nào giành được quyn x lý t h điu hành.
blocked-(b phong ta)- Mt tuyến đon chuyn vào trng thái blocked (b phong
ta) nếu mt trong các s kin sau xy ra:
o Phương thc sleep() ca tuyến đon được gi. Trong trường hp này,
tuyến đon vn trng thái blocked cho ti khi hết mt s ms (mili giây)
xác định.
o Tuyến đon gi phương thc wait() ca mt đối tượng. Trong trường hp
này tuyến đon vn trng thái blocked cho ti khi phương thc notify()
hoc notifyAll() được gi t mt tuyến đon khác. Các phương thc
wait(), notify()và notifyAll() thường được tìm thy trong các phương thc
đồng b synchronized ca đối tượng.
o Tuyến đon phong ta mt thao tác vào/ra. Trong trường hp này, tuyến
đon b phong ta cho ti khi hot động vào ra hoàn thành.
Dead (chết)-Mt tuyến đon thường trng dead khi phương thc run() hoàn thành
vic x lý.
a=A.getBalance();
a+=deposit;
A.setBalance(a);
b=B.getBalance();
b+=deposit;
B.setBalance(a);
http://www.ebook.edu.vn
2. To các ng dng đa tuyến đon vi lp Thread
Lp java.lang.Thread cung cp các phương thc để khi động (start()), tm dng
(suspend()), phc hi (resume()) và dng hn (stop()) mt tuyến đon, cũng như kim soát
các khía cnh khác như độ ưu tiên ca tuyến đon hoc tên ca tuyến đon gn vi nó.
Cách đơn gin nht để s dng lp Thread là tha kế lp này và np chng phương thc
run(), phương thc này được gi khi tuyến đon được khi động ln đầu. Bng cách np
chng phương thc run(), mt tuyến đon có th thc hin mt sc v hu ích hu
trường.
Chú ý: Cn nh rng các tuyến đon không chy t động ti thi đim chy. Thay vào
đó, ta phi gi phương thc Thread.start(), nếu không tuyến đon s không chy.
Khuông dng chung để to mt ng dng đa tuyến đon bng cách s dng lp
Thread
class C1 extends Thread
{
public C1(){this.start();}
public void run(){...}
}
Ví d: Viết chương trình to lp mt ng dng đa tuyến đon. To lp ra hai tuyến
đon mi tuyến đon in ra mt t vi tc độ khác nhau bng cách tha kế lp Thread
class PingPong extends Thread {
String word;
int delay;
PingPong(String s, int d)
{
word =s;
delay=d;
}
public void run()
{
try{
for(;;)
{
System.out.print(word+" ");
sleep(delay);
}
}
catch(InterruptedException e)
{
return;
}
}
public static void main(String[] args)
{
new PingPong("ping",33).start();
new PingPong("PONG",100).start();
}
}
http://www.ebook.edu.vn
3. To ng dng đa tuyến đon vi giao tiếp Runnable
Tha kế lp Thread là mt cách để to ra ng dng đa tuyến đon nhưng nó không
phi là gii pháp tt nht. Chúng ta đều biết rng Java ch h tr đơn tha kế nên vic cài
đặt các ng dng đa tha kế là không th được nếu to ng dng đa tuyến đon bng cách
tha kế t lp Thread. Mt gii pháp có th khc phc điu này là thc thi giao tiếp
java.lang.Runnable.
Giao tiếp Runnable định nghĩa duy nht mt phương thc run(). Các lp thc thi giao
tiếp này ch ra rng chúng có th chy độc lp như mt tuyến đon riêng. Giao tiếp này
không định nghĩa bt k phương thc nào khác hoc cung cp bt k chc năng tuyến đon
c th nào. Mc đích duy nht ca nó là báo hiu các lp thc thi giao tiếp này có th chy
như các tuyến đon. Khi mt đối tượng thc thi giao tiếp Runnale được truyn cho
constructor ca mt tuyến đon, và các phương thc start() ca tuyến đon được gi,
phương thc run() s t động được gi bi tuyến đon va được to ra. Khi phương thc
run() kết thúc x lý, tuyến đon s dng hot động.
Vic s dng giao tiếp Runnable có mt s ưu đim so vi tha kế lp Thread. Trước
hết, lp thc thi giao tiếp Runnable có th t do tha kế t mt lp khác. Th hai, cùng mt
đối tượng Runnable có th được truyn cho nhiu tuyến đon, vì vy mt s tuyến đon
tương tranh có th s dng chung mã và thao tác trên cùng d liu.
Khuôn dng chung để to mt ng dng đa tuyến đon bng cách thc thi giao tiếp
Runnable
class C2() implements Runnable
{
public C2(){Thread t = new Thread(this);}
public void run(){...}
}
Để lp trình tuyến đon ta phi s dng gói java.lang, tuy nhiên do gói ngày được mc
định nên ta không cn phi khai báo.
Ví d: Viết chương trình to lp mt ng dng đa tuyến đon. To lp ra hai tuyến đon
mi tuyến đon in ra mt t vi tc độ khác nhau bng cách thc thi giao tiếp Runnable.
class RunPingPong implements Runnable
{
String word;
int delay;
RunPingPong(String w, int d)
{
word =w;
delay=d;
}
public void run(){
try{
for(;;){
System.out.println(word+" ");
Thread.sleep(delay);
}
}