multi threading

Upload: huy-nguyen

Post on 09-Jul-2015

140 views

Category:

Documents


0 download

TRANSCRIPT

Chng I - Multithreading (a tuyn)Multithreading cho php hai phn ca cng mt chng trnh chy ng thi. Article ny tho lun v cch lm th no thc hin iu ny tt nht trong Java. y l mt phn trch t chng 10 ca cun sch Java Dymistyfied, c vit bi Jim Keogh. Cc vn ng vin marathon thng i mt vi tnh trng kh khn khi c hai cuc ua chnh ri vo trong cng mt tun bi v h phi chn mt cuc ua chy. H chc chn phi mong c c mt cch, mt phn ca h c th chy mt cuc ua v mt phn khc chy mt cuc ua khc. iu khng th xy ra l ngoi tr, vn ng vin chnh l mt chng trnh Java, bi v hai phn ca mt chng trnh Java c th chy ng thi bng vic s dng multithreading. Bn s hc v multithreading v cch lm th no chy ng thi cc phn ca chng trnh ca bn trong chng ny. I- Multitasking (a nhim) Multitasking thc thi hai hay nhiu tc nhim cng mt lc. Gn nh tt c cc h iu hnh u c kh nng multitasking bi vic s dng mt trong hai k thut multitasking: multitasking da trn process (x l) v multitasking da trn thread (phn tuyn). Multitasking da trn process chy hai chng trnh cng mt lc. Cc lp trnh vin ni n mt chng trnh l mt process. V th bn c th ni rng, multitasking da trn process l multitasking da trn chng trnh. Multitasking da trn thread c mt chng trnh thc hin hai tc nhim cng mt thi im. V d, mt chng trnh x l vn bn c th kim tra li chnh t trong mt ti liu trong khi bn ang vit mt ti liu . l multitasking da trn thread. Cch kh tt nh c s khc nhau gia multitasking da trn process v multitasking da trn thread l hy ngh da trn process l lm vic vi nhiu chng trnh v da trn thread l lm vic vi nhiu phn ca mt chng trnh. Mc tiu ca multitasking l s dng thi gian ngh ca CPU. Tng tng rng CPU l mt ng c trong xe hi ca bn. ng c xe ca bn lun chy cho d xe hi c di chuyn hay khng. Bn mun xe hi di chuyn nhiu n mc c th, bn c th chy c nhiu dm t mt gallon ga. Mt ng c khng lng ph ga. Cng mt khi nim nh th p dng cho CPU ca my tnh ca bn. Bn mun CPU ca bn xoay vng x l cc lnh v d liu hn l ch mt iu g x l. Mt CPU xoay vng l nhng g tng t vi s vn hnh ca ng c ca bn. C th kh khn tin tng, nhng CPU ngh nhiu hn l n x l trong nhiu my tnh bn. Hy ni rng, bn ang s dng mt trnh x l vn bn vit mt ti liu. Trong hu ht cc phn vic, CPU khng lm g c cho n khi bn nhp mt k t t bn phm hoc di chuyn chut. Multitasking c thit k s 1

dng phn nh ca mt giy x l cc lnh t mt chng trnh khc hoc t mt phn khc ca cng mt chng trnh. To nn s s dng CPU mt cch c hiu qu khng phi l qu quyt nh i vi cc chng trnh chy trn mt my tnh bn bi v hu ht chng ta him khi chy nhng chng trnh ng thi hoc chy nhiu phn ca cng mt chng trnh vo mt thi im. Tuy nhin, nhng chng trnh chy trn mi trng mng, cn trao i x l t nhiu my tnh, th cn phi to ra mt thi gian ngh hiu qu ca CPU. II - Multithreading trong Java Overhead H iu hnh phi lm nhng cng vic ph qun l multitasking, cc lp trnh vin gi cng vic ph ny l overhead bi v cc ti nguyn trong my tnh ca bn c s dng qun l s hot ng ca multitasking nhiu hn l c s dng bi cc chng trnh x l cc lnh v d liu. Multitasking da trn process c mt overhead ln hn multitasking da trn thread. Trong multitasking da trn process, mi process yu cu khng gian a ch ca chnh n trong vng nh. H iu hnh yu cu mt lng thi gian CPU xc nh chuyn t mt x l ny sang mt x l khc. Cc lp trnh vin gi y l context switching, mi process (hay chng trnh) l mt context. Cc ti nguyn c b sung cn cho mi process giao tip vi mi process khc. Trong s so snh ny, cc thread trong multitasking da trn thread chia s cng mt khng gian a ch trong vng nh bi v chng chia s cng mt chng trnh. y cng c mt tc ng trong context switching, bi v chuyn i t mt phn ca chng trnh sang mt phn khc xy ra trong cng mt khng gian a ch ca vng nh. Ngc li, vic giao tip gia cc phn ca chng trnh xy ra trong cng mt v tr vng nh. III - Thread Mt thread l mt phn ca chng trnh ang chy. Multitasking da trn thread c nhiu thread chy cng mt thi im (nhiu phn ca mt chng trnh chy cng mt lc). Mi thread l mt cch thc thi khc nhau. Hy tr v v d trnh x l vn bn xem cc thread c s dng nh th no. Hai phn ca trnh x l vn bn c quan tm: u tin l phn nhn cc k t nhp t bn phm, lu chng vo b nh, v hin th chng trn mn hnh. Phn th hai l phn cn li ca chng trnh nhm kim tra chnh t. Mi phn l mt thread thc thi c lp vi phn khc. Thm ch d chng l cng mt chng trnh. Trong khi mt thread nhn v x l cc k t c nhp t bn phm, thread khc ng. l, thread khc dng cho n khi CPU ngh. CPU thng ngh gia cc ln g phm. Vo khong thi gian ny, thread b kim tra chnh t ang ng thc dy tip tc kim tra chnh t ca ti liu. Thread b kim tra chnh t dng mt ln na khi k t k tip c nhp t bn phm. Mi trng runtime Java qun l cc thread khng ging nh multitasking da 2

trn process m h iu hnh qun l vic chuyn i gia cc chng trnh. Cc thread c x l ng b. iu c ngha l mt thread c th dng trong khi mt thread c th tip tc x l. Mt thread c th l mt trong bn trng thi sau: +Running: mt thread ang c thc thi. +Suspended: vic thc thi b tm dng v c th phc hi ti thi im dng +Blocked: mt ti nguyn khng th c truy cp bi v n ang c s dng bi mt thread khc. +Terminated: vic thc thi b ngng hn v khng th phc hi. Tt c cc thread khng ging nhau. Mt vi thread quan trng hn nhng thread khc v c cho quyn u tin cao hn i vi cc ti nguyn nh CPU. Mi thread c gn mt quyn u tin thread c s dng xc nh khi no th chuyn t mt thread ang thc thi sang mt thread khc. c gi l context switching. Quyn u tin ca mt thread c quan h vi quyn u tin ca cc thread khc. Quyn u tin ca mt thread l khng thch hp khi ch c mt mnh thread ang chy. Thread c quyn u tin thp hn cng chy nhanh nh thread c quyn u tin cao hn nu nh khng c thread no khc chy cng mt lc. Cc quyn u tin ca thread c s dng khi cc quy lut ca context switching c s dng. Di y l nhng quy lut ny: Mt thread c th t ng sn sinh ra mt thread khc. lm c iu ny, iu khin c tr v cho thread c quyn u tin cao nht. Mt thread c quyn u tin cao hn c th ginh quyn s dng CPU t mt thread c quyn u tin thp hn. Thread c quyn u tin thp hn b tm dng bt chp n ang lm g tr v theo cch ca thread c quyn u tin cao hn. Cc lp trnh vin gi y l preemptive multitasking. Cc thread c quyn u tin bng nhau c x l da trn cc quy lut ca h iu hnh ang c s dng chy chng trnh. V d, Windows s dng time slicing, bao gm vic cho mi thread c quyn u tin cao mt vi mili giy ca vng CPU v gi vic xoay vng gia cc thread c quyn u tin cao. Trong Solaris, thread c quyn u tin cao nht phi t ng sn sinh ra cc thread c quyn u tin cao khc. Nu khng, thread c quyn u tin cao th nh phi ch thread c quyn u tin cao nht kt thc. IV - S ng b ho Multithreading xy ra khng ng b, c ngha l mt thread thc thi c lp vi cc thread khc. Theo , mi thread khng ph thuc vo s thc thi ca cc thread khc. bt buc, cc x l chy ng b ha ph thuc vo cc x l khc. l mt x l ch cho n khi mt x l khc kt thc trc khi n c th thc thi. Thnh thong, vic thc thi ca mt thread c th ph thuc vo vic thc thi ca 3

mt thread khc. Gi s bn c hai thread mt tp hp cc thng tin ng nhp v mt ci khc kim tra mt khu v ID ca ngi dng. Thread login phi ch thread validation hon tt x l trc khi n c th ni cho ngi dng vic ng nhp c thnh cng hay khng. V th c hai thread phi c thc thi ng b, khng c khng ng b. Java cho php cc thread ng b ha c nh ngha bi mt method ng b ho. Mt thread nm trong mt method ng b ha ngn bt k thread no khc t mt phng thc ng b ho khc gi trong cng mt i tng. Bn s hc chng trong phn sau ca chng ny. V -Interface (giao tip) Runnable v cc lp Thread Bn khi dng cc thread bng vic s dng interface Runnable v class Thread. iu ny c ngha l thread ca bn phi k tha t class Thread hoc b sung interface Runnable. Class Thread nh ngha bn trong cc method bn s dng qun l thread. Di y l cc method thng dng c nh ngha trong class Thread. Method M t getName() Tr v tn ca thread getPriority() Tr v quyn u tin ca thread. isAlive() Xc nh thread no ang chy join() Tm dng cho n khi thread kt thc run() Danh mc cn thc hin bn trong thread sleep() Suspends mt thread. Method ny cho php bn xc nh khong thi gian m thread c cho tm dng start() Bt u thread. VI - Main thread Mi chng trnh Java c mt thread, thm ch nu bn khng to ra bt k thread no. Thread ny c gi l main thread bi v n l thread thc thi khi bn bt u chng trnh ca bn. Main thread sinh ra cc thread m bn to ra. Nhng thread gi l child thread. Main thread lun lun l thread cui cng kt thc vic thc thi bi v thng thng main thread cn gii phng ti nguyn c s dng bi chng trnh chng hn nh cc kt ni mng. Cc lp trnh vin c th iu khin main thread bng cch u tin to ra mt i tng thread v sau s dng cc method ca i tng thread iu khin main thread. Bn to i tng thread bng cch gi method currentThread(). Method currentThread() tr v mt reference (tham chiu) n thread, sau bn s dng reference ny iu khin main thread nh bt k thread no khc. to mt reference n main thread v i tn ca thread t main thnh Demo Thread. Chng trnh di y ch ra lm th no lm c iu ny. Mn hnh hin th khi chng trnh chy Current thread: Thread[main, 5,main] 4

Renamed Thread: Thread[Demo Thread, 5,main] on m di y s th hin iu . class Demo { public static void main (String args[] ) { Thread t = Thread.currentThread(); System.out.println("Current thread: " + t); t.setName("Demo Thread"); System.out.println("Renamed Thread: " + t); } } Nh bn hc trong chng ny, mt thread t ng c to ra khi bn thc thi mt chng trnh. Mc ch ca v d ny l cng b mt reference n mt thread v gn n cho main thread. iu ny c thc hin trong dng u tin ca method main(). Chng ta cng b reference bng vic xc nh tn ca lp v tn cho reference. iu ny c thc hin nh dng m Thread t = Thread.currentThread() Chng ta c c mt reference n main thread bng vic gi method currentThread() ca class Thread. Reference tr v bi method currentThread() sau c gn cho reference c cng b trc trong phn m u pht biu. Thread[main, 5,main] Thng tin bn trong cp ngoc vung ni cho chng ta bit vi thng tin v thread. T main xut hin u tin l tn ca thread. S 5 l quyn u tin ca thread, l quyn u tin thng thng. Quyn u tin nm trong phm vi t 1 n 10, trong 1 l thp nht v 10 l cao nht. T main nm cui cng l tn ca nhm thread m thread thuc v. Mt nhm cc thead l mt cu trc d liu c s dng iu khin trng thi ca mt tp hp cc thread. Bn khng cn quan tm n nhm thread bi v mi trng Java run-time x l iu ny. Method setName() c gi ch ra lm th no bn iu khin main thread ca chng trnh ca bn.Method setName() l mt method thnh vin ca class Thread v c s dng thay i tn ca mt thread. V d ny s dng setName() thay i tn ca main thread t main thnh Demo Thread. Thread hin th mt ln na trn mn hnh vi tn c thay i. VII - To cc thread ca ring bn Nh rng chng trnh ca bn l main thread, v cc phn khc ca chng trnh ca bn c th cng l mt thread. Bn c th thit k mt phn ca chng trnh ca bn l thread bng vic to ra thread ca ring bn. Cch d dng nht lm iu ny l b sung interface Runnable. Vic b sung interface Runnable l mt la chn cc lp ca bn k tha class Thread. Mt interface m t mt hay nhiu method thnh vin m bn phi nh ngha trong class ca bn theo quy nh tun theo interface. Nhng method ny c m 5

t vi tn method, danh sch i s v gi tr tr v. Interface Runnable m t cc method ca lp cn to v tng tc vi mt thread. Theo quy nh, s dng interface trong class ca bn, bn phi nh ngha cc method c m t trong interface Runnable. Kh thun li, bn ch cn nh ngha mt method c m t bi interface Runnable method run(). Method run() phi l mt method public, v n khng yu cu danh sch i s cng nh gi tr tr v. Ni dung ca method run() l mt phn ca chng trnh bn s tr thnh mt thread mi. Cc pht biu bn ngoi method run() l thuc v main thread. Cc pht biu bn trong method run() thuc v thread mi. C main thread v thread mi chy cng mt lc khi bn bt u thread mi. Bn s hc iu ny trong v d k tip. Thread mi kt thc khi method run() kt thc. iu khin sau tr v cho pht biu gi method run(). Khi bn b sung interface Runnable, bn s cn gi khi dng di y ca class Thread. Khi dng ny yu cu hai i s. i s u tin l thc th ca lp b sung interface Runnable v ni cho khi dng bit thread c thc thi t u. i s th hai l tn ca thread mi. y l nh dng ca khi dng: Thread(Runnable class, String name) Khi dng to ra mt thread mi nhng n khng bt u thread. Bn bt u thread bng cch gi method start(). Method start() gi method run() bn nh ngha trong chng trnh ca bn. Method start() khng c danh sch i s v khng c gi tr tr v. V d di y ch ra lm th no to ra v bt u mt thread mi. y l nhng g hin th khi chng trnh chy. Main thread started Child thread started Child thread terminated Main thread terminated class MyThread implements Runnable { Thread t; MyThread() { t = new Thread(this,"My thread"); t.start(); } public void run() { System.out.println("Child thread started"); System.out.println("Child thread terminated"); } }

6

class Demo { public static void main(String args[]) { new MyThread(); System.out.println("Main thread started"); System.out.println("Main thread terminated"); } } V d ny bt u bng vic nh ngha mt class gi l MyThread, b sung interface Runnable. V th chng ta s dng t kha implements b sung interface Runnable. K tip, mt reference n thread c cng b. Tip l nh ngha khi dng cho class. Khi dng ny gi khi dng ca class Thread. Bi v chng ta b sung interface Runnable, chng ta cn t khi dng reference n thc th ca class s thc thi thread mi v tn ca thread mi. Ch rng, t kha this l mt reference n thc th hin hnh ca class. Khi dng tr v mt reference cho thread mi, v c gn cho reference c cng b pht biu u tin trong class MyThread. Chng ta s dng reference ny gi method start(). Nh rng method start() gi method run() K n chng ta nh ngha method run(). Nhng pht biu bn trong method run() tr thnh mt phn ca chng trnh thc thi khi thread thc thi. Ch c hai pht biu th hin trong method run(). K tip, chng ta nh ngha class chng trnh. Class chng trnh thc thi thread mi bng vic gi thc th ca class MyThread. Thc hin iu ny bng cch gi ton t new v khi dng ca class MyThread. Cui cng chng trnh kt thc bng vic hin th hai dng trn mn hnh.

Chng II - Multithreading trong Java(Phn ny tip tc trnh by cch to thread bng vic s dng t kha extends v cch to quyn u tin cho thread) I - To mt Thread s dng extends Bn c th k tha class Thread nh mt cch khc to thread trong chng trnh ca bn. Bng vic s dng t kha extends khi nh ngha class k tha class khc, khi bn cng b mt thc th ca class bn cng c truy cp n nhng thnh vin ca class Thread. Bt c khi no class ca bn k tha class Thread, bn phi override (ci chng) method run(), l mt phn trong thread mi. V d di y ch ra lm th no k tha class Thread v override method run(). V d ny nh ngha class MyThread k tha class Thread. Khi dng ca class MyThread gi khi dng ca class Thread bng vic s dng t kha super v t vo tn ca thread mi, chnh l MyThread. Sau n gi method start() 7

kch hot thread mi. Method start() gi method run() ca class MyThread. Bn s ch rng trong v d ny, method run() c override bng vic hin th hai dng trn mn hnh ch ra rng child thread bt u v kt thc. Nh rng cc pht biu bn trong method run() to nn phn chng trnh chy nh thread. V th chng trnh ca bn s c nhiu pht biu hn trong method run() hn l trong v d ny. Thread mi c cng b bn trong method main() ca class Demo, chnh l class chng trnh ca ng dng. Sau khi thread bt u, hai thng ip hin th ch ra trng thi ca main thread class MyThread extends Thread { MyThread(){ super("My thread"); start(); } public void run() { System.out.println("Child thread started"); System.out.println("Child thread terminated"); } } class Demo { public static void main (String args[]){ new MyThread(); System.out.println("Main thread started"); System.out.println("Main thread terminated"); } } Ch rng, bn nn b sung interface Runnable nu nh ch c method run() l method ca class Thread m bn cn override. Bn nn k tha class Thread nu nh bn cn override nhng method khc c nh ngha trong class Thread. II - S dng nhiu thread trong mt chng trnh. Khng phi khng thng cn phi chy nhiu thc th ca mt thread, chng hn nh chng trnh ca bn in ra nhiu ti liu cng mt lc. Cc lp trnh vin gi y l spawning mt thread. Bn c th sinh ra bt k s lng thread no m bn cn bng class ca ring bn c nh ngha u tin c b sung interface Runnable hoc k tha class Thread v sau cng b cc thc th ca class. Mi thc th l mt thread mi. Hy xem iu ny c thc hin th no. V d k tip nh ngha mt class gi l MyThread b sung interface Runnable. Khi dng ca MyThread chp nhn mt i s, l mt chui c s dng nh tn ca thread mi. Chng ta to ra thread mi bn trong khi dng bng cch gi khi dng ca class Thread v truyn vo mt reference n i tng ang nh ngha thread v tn ca thread. 8

Nh rng, t kha this l mt reference n i tng hin ti. Method start() sau khi c gi s gi method run(). Method run() c override trong class MyThread. C hai iu xy ra khi method run() thc thi. u tin tn ca method hin th trn mn hnh. Th hai, thread tm dng 2 giy khi method sleep() c gi. Method sleep() c nh ngha trong class Thread c th chp nhn mt hoc hai tham s. Tham s u tin l s mili giy m thread tm dng. Tham s th hai l s micro giy m thread tm dng. Trong v d ny, chng ta ch quan tm n mili giy v th chng ta khng cn tham s th hai (2000 nano giy l 2 giy). Sau khi thread tm dng, cc pht biu khc hin th trn mn hnh bt u l thread ang kt thc. Method main() ca class Demo cng b bn thc th ca cng mt thread bng vic gi khi dng ca class MyThread v truyn vo tn ca thread. Mi thread ny c coi nh mt thread nh. Main thread sau tm dng 10 giy bng vic gi method sleep(). Trong sut thi gian ny, cc thread tip tc thc thi. Khi main thread quay li, n hin th thng ip rng main thread ang kt thc. y l nhng g trn mn hnh hin th khi v d chy Thread: 1 Thread: 2 Thread: 3 Thread: 4 Terminating thread: 1 Terminating thread: 2 Terminating thread: 3 Terminating thread: 4 Terminating thread: main thread. M ngun ca v d: class MyThread implements Runnable { String tName; Thread t; MyThread (String threadName) { tName = threadName; t = new Thread (this, tName); t.start(); } public void run() { try { System.out.println("Thread: " + tName ); Thread.sleep(2000); } catch (InterruptedException e ) { System.out.println("Exception: Thread " 9

+ tName + " interrupted"); } System.out.println("Terminating thread: " + tName ); } } class Demo { public static void main (String args []) { new MyThread ("1"); new MyThread ("2"); new MyThread ("3"); new MyThread ("4"); try { Thread.sleep (10000); } catch (InterruptedException e) { System.out.println("Exception: Thread main interrupted."); } System.out.println("Terminating thread: main thread."); } } III - S dng isAlive() v join() Thng thng, main thread l thread cui cng kt thc trong mt chng trnh. Tuy nhin, khng phi l bo m khng c nhng trng hp, main thread s kt thc trc khi mt child thread kt thc. Trong v d trc, chng ti ni method main ng cho n khi cc child thread kt thc. Tuy nhin chng ti c lng khong thi gian n thc hin cc child thread hon tt x l. Nu khong thi gian c lng qu ngn, mt child thread c th kt thc sau khi main thread kt thc. V th, k thut sleep khng phi l cch tt nht bo m rng main thread kt thc cui cng. Cc lp trnh vin s dng hai cch khc xc nh rng main thread l thread cui cng kt thc. Nhng k thut ny bao gm vic gi method isAlive() v method join(). C hai method ny u c nh ngha trong class Thread. Method isAlive() xc nh cn method no ang chy hay khng. Nu cn, isAlive() tr v gi tr Boolean true. Ngc li, Boolean false c tr v. Bn s dng method isAlive() xc nh cn child method no tip tc chy hay khng. Method join() ch cho n khi child thread kt thc v kt ni main thread. Ngoi ra, bn c th s dng method join() xc nh lng thi gian m bn mun ch mt child thread kt thc. V d di y ch ra s dng method isAlive() v method join() trong chng trnh ca bn nh th no. V d ny gn ging v d trc. S khc bit nm method main() ca class Demo. Sau khi cc thread c cng b s dng khi dng ca class MyThread. Method 10

isAlive() c gi cho mi thread. Gi tr tr v ca method isAlive() c hin th trn mn hnh. K tip method join() c gi cho mi thread. Method join() lm cho main thread ch tt c cc child thread hon tt x l trc khi main thread kt thc. y l nhng g hin th trn mn hnh khi chng trnh chy. Thread Status: Alive Thread 1: true Thread 2: true Thread 3: true Thread 4: true Threads Joining. Thread: 1 Thread: 2 Thread: 3 Thread: 4 Terminating thread: 1 Terminating thread: 2 Terminating thread: 3 Terminating thread: 4 Thread Status: Alive Thread 1: false Thread 2: false Thread 3: false Thread 4: false Terminating thread: main thread. M ngun class MyThread implements Runnable { String tName; Thread t; MyThread (String threadName) { tName = threadName; t = new Thread (this, tName); t.start(); } public void run() { try { System.out.println("Thread: " + tName ); Thread.sleep(2000); } catch (InterruptedException e ) { System.out.println("Exception: Thread " + tName + " interrupted"); 11

} System.out.println("Terminating thread: " + tName ); } } class Demo { public static void main (String args []) { MyThread thread1 = new MyThread ("1"); MyThread thread2 = new MyThread ("2"); MyThread thread3 = new MyThread ("3"); MyThread thread4 = new MyThread ("4"); System.out.println("Thread Status: Alive"); System.out.println("Thread 1: " + thread1.t.isAlive()); System.out.println("Thread 2: " + thread2.t.isAlive()); System.out.println("Thread 3: " + thread3.t.isAlive()); System.out.println("Thread 4: " + thread4.t.isAlive()); try { System.out.println("Threads Joining."); thread1.t.join(); thread2.t.join(); thread3.t.join(); thread4.t.join(); } catch (InterruptedException e) { System.out.println("Exception: Thread main interrupted."); } System.out.println("Thread Status: Alive"); System.out.println("Thread 1: " + thread1.t.isAlive()); System.out.println("Thread 2: " + thread2.t.isAlive()); System.out.println("Thread 3: " + thread3.t.isAlive()); System.out.println("Thread 4: " + thread4.t.isAlive()); System.out.println("Terminating thread: main thread."); } } IV - Ci t quyn u tin ca Thread Trong phn trc, bn hc c mi thread c mt quyn u tin c gn c s dng nhng thread quan trng hn s dng ti nguyn. Quyn u tin c s dng nh mt hng dn cho h iu hnh xc nh c thread no c truy cp n mt ti nguyn chng hn nh CPU. Trong thc t, h iu hnh t cc trnh qun l vo trong s qun l ca n. Thng thng cc lp trnh vin c mt t hoc khng c quyn iu khin i vi nhng trnh qun l khc. V th, chng thnh lp quyn u tin cho cc thread ca chng m khng quan tm xa hn n nhng trnh qun l khc. 12

Mt quyn u tin l mt s nguyn chnh xc t 1 n 10, trong 10 l quyn u tin cao nht c xem nh quyn u tin ti a, v 1 l quyn u tin thp nht c xem nh quyn u tin ti thiu. Quyn u tin thng thng l 5, l quyn u tin mc nh cho mi thread. Ni chung, mt thread c quyn u tin cao hn ginh vic s dng ti nguyn ca thread c quyn u tin thp hn. Thread c quyn u tin thp hn tm dng cho n khi thread c quyn u tin cao hn kt thc vic s dng ti nguyn. Bt k khi no, c hai thread c quyn u tin bng nhau cn cng ti nguyn cng mt thi im, thread no truy cp ti nguyn u tin ginh c quyn s dng ti nguyn. Nhng g xy ra cho thread th hai ph thuc vo h iu hnh m bn ang chy chng trnh. Mt s h iu hnh bt thread th hai ch cho n khi thread th nht kt thc s dng ti nguyn. H iu hnh khc yu cu thread u tin thread th hai truy cp ti nguyn sau mt khong thi gian xc nh. iu ny chc chn rng mt thread khng chim dng ti nguyn v ngn cc thread khc s dng n. Trong th gii thc, thread u tin thng tm dng trong khi s dng ti nguyn bi v ti nguyn khc n cn khng c sn. Trong sut thi gian tm dng , h iu hnh thread u tin gii phng ti nguyn. Vn l bn khng bit khi no thi gian tm dng xy ra. Do tt nht l lun lun mt thread tm dng sau mt khong thi gian bt c khi no thread ang s dng ti nguyn sut mt khong thi gian di. Theo cch ny, thread chia s ti nguyn vi nhng thread khc. Bn cn nh rng c mt mt tiu cc khi tm dng mt thread trong mt khong thi gian mt cch t ng. Vic dng mt thread lm gim i kh nng thc thi ca chng trnh ca bn v c th gy ra mt li backlog trong vic s dng ti nguyn. Do bn cn quan st vic thc thi chng trnh ca bn mt cch u n chc chn rng bn khng phi chu ng s nh hng tiu cc ca vic dng mt thread. By gi, hy tp trung vo nhng g bn lm iu khin n nh quyn u tin ca mt thread. Bn n nh quyn u tin ca mt thread bng cch gi method setPriority(), c nh ngha trong class Thread. Method setPriority() yu cu mt tham s, l mt s nguyn thay th cho mc ca quyn u tin. Bn c hai cch thay th quyn u tin. Bn c th s dng mt s nguyn t 1 n 10, hoc bn c th s dng cc bin final c nh ngha trong class Thread. Cc bin ny l MAX_PRIORITY, MIN_PRIORITY v NORM_PRIORITY. Bn c th xc nh c mc u tin ca thread bng method getPriority(), cng c nh ngha trong class Thread. Method getPriority() khng yu cu tham s no, v n tr v mt s nguyn thay th cho mc ca quyn u tin ca thread. V d di y ch ra lm th no s dng method setPriority() v method getPriority(). V d ny to ra hai child thread v n nh quyn u tin cho mi thread. u tin thread c quyn u tin thp bt u, v sau l thread c quyn 13

u tin cao. Di y l nhng g hin th khi chy chng trnh (ch rng thread c quyn u tin cao chy trc thread c quyn u tin thp mc d thread c quyn u tin thp bt u trc low priority started high priority started high priority running. low priority running. low priority stopped. high priority stopped. M ngun: class MyThread implements Runnable { Thread t; private volatile boolean running = true; public MyThread (int p, String tName) { t = new Thread(this,tName); t.setPriority (p); } public void run() { System.out.println(t.getName() + " running."); } public void stop() { running = false; System.out.println(t.getName() + " stopped."); } public void start() { System.out.println(t.getName() + " started"); t.start(); } } class Demo { public static void main(String args[] ) { Thread.currentThread().setPriority(10); MyThread lowPriority = new MyThread (3, "low priority"); MyThread highPriority = new MyThread (7, "high priority"); lowPriority.start(); highPriority.start(); try { Thread .sleep(1000); } catch ( InterruptedException e) { 14

System.out.println("Main thread interrupted."); } lowPriority.stop(); highPriority.stop(); try { highPriority.t.join(); lowPriority.t.join(); } catch (InterruptedException e) { System.out.println("InterruptedException caught"); } } }

15

Chng III - Multithreading (a tuyn) trong Java(nh hng quan trng khi hai hay nhiu hn cc thread chia s cng ti nguyn l ch c mt trong s chng c th truy cp vo ti nguyn ti mt thi im. Cc lp trnh vin xc nh vic ny bng vic ng b ho cc thread.) I - ng b ho cc Thread nh hng quan trng khi hai hay nhiu hn cc thread chia s cng ti nguyn l ch c mt trong s chng c th truy cp vo ti nguyn ti mt thi im. Cc lp trnh vin xc nh vic ny bng vic ng b ho cc thread. Cc thread c ng b ho trong Java s dng thng qua mt monitor. Hy ngh rng, mt monitor l mt object cho php mt thread truy cp vo mt ti nguyn. Ch c mt thread s dng mt monitor vo bt k mt khong thi gian no. Cc lp trnh vin ni rng, cc thread s hu monitor vo thi gian . Monitor cng c gi l mt semaphore. Mt thread c th s hu mt monitor ch nu nh thread khc khng s hu monitor. Nu monitor c sn, mt thread c th s hu monitor v truy cp thng n ti nguyn c tp hp vi monitor . Nu monitor khng c sn, thread s b suspend cho n khi monitor tr thnh c sn. Cc lp trnh vin ni rng thread ang ch monitor. Cui cng, tc nhim ca vic yu cu mt monitor xy ra ng sau mn chn trong Java. Java x l tt c cc chi tit cho bn. Bn phi ng b ho cc thread trong chng trnh ca bn nu nh c nhiu hn mt thread s dng cng mt ti nguyn. Bn c hai cch ng b ho cc thread: bn s dng method c ng b ha hoc statement c ng b ha. II - S dng method c ng b ha Tt c cc object trong Java c mt monitor. Mt thread c mt monitor bt k khi no mt method c b sung t kha synchronized c gi. Thread ln u tin gi method c ng b ha c ni nm bn trong method v s hu method cng nh ti nguyn s dng bi method. Cc thread khc gi method c ng b ho ch cho n khi thread u tin gii phng method c ng b ha. Nu method c ng b ho l mt instance method, method c ng b ha kch hot kha i km vi instance c gi l method c ng b ha chnh l object c bit l this trong sut qu trnh thc thi ton b method. Nu method c ng b ha l static th n kch hot kha i km vi class nh ngha method c ng b ho. Trc khi bn hc cch lm th no nh ngha mt method ng b ha 16

trong chng trnh ca bn, hy xem nhng g xy ra nu vic ng b ho khng c s dng trong mt chng trnh. y l mc ch ca v d di y, chng trnh s hin th hai tn bn trong du ngoc n s dng hai thread. y l tin trnh ba bc, bao gm m ngoc n, tn v ng ngoc n hin th trong tng bc. V d nh ngha ba lp, class Parentheses, class MyThread v class Demo cng l class chng trnh. Class Parentheses nh ngha mt method display(), nhn vo mt chui trong danh sch i s ca n v hin th chui trong ngoc n trn mn hnh. Class MyThread nh ngha mt thread. Trong khi lm iu ny, khi dng ca MyThread yu cu hai i s. i s u tin l mt reference n mt instance ca class Parentheses. i s th hai mt chui cha tn s hin th trn mn hnh. Method run() s dng instance ca class Parentheses gi method display ca n, truyn vo cho method display() tn n xut hin trn mn hnh. Phn cn li hot ng trong method main() ca class Demo. Pht biu u tin cng b mt instance ca class Parentheses. Hai dng k tip to ra hai thread. Ch rng c hai thread ny s dng cng mt instance ca class Parentheses. y l nhng g hin th khi bn chy chng trnh. C th s khng nh bn mong i. Mi tn nn c bao trong cp ngoc n ca chng. Vn l method display() khng ng b ho. class Parentheses { void display(String s) { System.out.print ("(" + s); try { Thread.sleep (1000); } catch (InterruptedException e) { System.out.println ("Interrupted"); } System.out.println(")"); } } class MyThread implements Runnable { String s1; Parentheses p1; Thread t; public MyThread (Parentheses p2, String s2) { p1= p2; s1= s2; t = new Thread(this); t.start(); } 17

public void run() { p1.display(s1); } } class Demo{ public static void main (String args[]) { Parentheses p3 = new Parentheses(); MyThread name1 = new MyThread(p3, "Bob"); MyThread name2 = new MyThread(p3, "Mary"); try { name1.t.join(); name2.t.join(); } catch (InterruptedException e ) { System.out.println( "Interrupted"); } } } Vn trong v d trn l cc thread cng chia s ti nguyn cng mt lc. Ti nguyn c method display() nh ngha trong class Parentheses. Theo quy nh mt thread t iu khin i vi method display() chng ta phi ng b ha method display(). iu ny c thc hin bng cch s dng t kha synchronized t u method display(). y l nhng g bn mun thy trong v d trc. class Parentheses { synchronized void display(String s) { System.out.print ("(" + s); try { Thread.sleep (1000); } catch (InterruptedException e) { System.out.println ("Interrupted"); } System.out.println(")"); } } class MyThread implements Runnable { String s1; Parentheses p1; Thread t; public MyThread (Parentheses p2, String s2) { 18

p1= p2; s1= s2; t = new Thread(this); t.start(); } public void run() { p1.display(s1); } } class Demo{ public static void main (String args[]) { Parentheses p3 = new Parentheses(); MyThread name1 = new MyThread(p3, "Bob"); MyThread name2 = new MyThread(p3, "Mary"); try { name1.t.join(); name2.t.join(); } catch (InterruptedException e ) { System.out.println( "Interrupted"); } } }

19

Vic ng b ha mt method l cch tt nht hn ch vic s dng mt method ti mt thi im. Tuy nhin s c nhng trng hp m bn khng th ng b ha mt method, chng hn nh khi bn s dng mt class c cung cp bi bn th ba. Trong nhng trng hp nh th, bn khng c php truy cp vo nh ngha lp, s ngn bn s dng t kha synchronized. III - S dng pht biu c ng b ho Mt cch khc s dng t kha synchronized l s dng pht biu c ng b ha. Mt pht biu c ng b ha cha mt block c ng b ha , m bn trong t nhng i tng v nhng method c ng b ha. Gi cc method cha block c ng b ha xy ra khi mt thread c c monitor ca i tng. Mc d bn c th gi nhng method bn trong mt block c ng b ha, vic cng b method phi c thc hin bn ngoi mt block c ng b ha. V d di y ch cch lm th no s dng mt pht biu c ng b ha. V d ny c bn cng ging v d trc, tuy nhin pht biu c ng b ha c s dng thay v t kha synchronized. Pht biu ny c t trong method run() ca class MyThread. Pht biu c ng b ha s ng b ha instance ca class Parentheses v v th ngn hai thread s dng method display() cng mt lc. class Parentheses { void display(String s) { System.out.print ("(" + s); try { Thread.sleep (1000); } catch (InterruptedException e) { System.out.println ("Interrupted"); } System.out.println(")"); } } class MyThread implements Runnable { String s1; Parentheses p1; Thread t; public MyThread (Parentheses p2, String s2) { p1= p2; s1= s2; t = new Thread(this); t.start(); } public void run() { synchronized(p1){ 20

p1.display(s1); } } } class Demo{ public static void main (String args[]) { Parentheses p3 = new Parentheses(); MyThread name1 = new MyThread(p3, "Bob"); MyThread name2 = new MyThread(p3, "Mary"); try { name1.t.join(); name2.t.join(); } catch (InterruptedException e ) { System.out.println( "Interrupted"); } } } y, method display() khng s dng t kha synchronized. Thay vo , pht biu c ng b ha c s dng bn trong method run(). iu ny cho kt qu ging vi v d trc bi v mt thread ch mt khong thi gian thread cn li kt thc trc khi tip tc x l. IV - Giao tip gia cc thread Cc thread m ra cho cc lp trnh vin mt khong khng mi trong lp trnh, ni m nhng phn ca mt chng trnh thc thi khng ng b vi nhau, mi mt x l c lp vi nhng x l khc. Tuy nhin mi thread thnh thong cn tnh ton vic x l ca chng v v th cn c th giao tip vi nhng thread khc trong sut qu trnh x l. Cc lp trnh vin gi y l inter-process communication (giao tip trong x l). Bn c th c cc thread giao tip vi cc thread khc trong chng trnh ca bn bng cch s dng nhng method wait(), notify() v notifyAll(). Nhng method ny c gi t bn trong mt method c ng b ha. Method wait() ni cho mt thread gii phng monitor v i vo trng thi suspend. C hai dng method wait() khc nhau. Mt dng khng yu cu i s v v th mt thread s ch cho n khi n c thng bo. Mt dng khc c i s bn xc nh khong thi gian ch. Bn xc nh di thi gian trong mili giy v t n vo trong method wait(). Method notify() ni cho mt thread ang suspend bi method wait() v ly li iu khin ca monitor. Method notifyAll() nh thc tt c cc thread ang ch iu khin ca monitor. Nhng thread khc ch trong trng thi suspend cho n khi monitor c sn tr li. 21

V d di y ch cho bn lm th no s dng nhng method ny trong mt ng dng. Mc ch ca chng trnh l c mt class Pulishser cho mt gi tr cho class Consumer thng qua s dng class Queue. V d ny nh ngha bn class, class Pulisher, class Comsumer, class Queue v class Demo. Class Queue nh ngha hai instance: exchangeValue v mt bin c. exchangeValue t vo mt gi tr trong queue bi publisher. Bin c c s dng nh mt cch nh du gi tr c t vo trong queue. Class Queue cng nh ngha mt method get() v mt method put(). Method put() s dng t mt gi tr vo queue (gn mt gi tr cho exchangeValue), method get() s dng nhn gi tr cha trong queue (tr v gi tr ca exchangeValue. Khi mt gi tr c gn, method put() thay i gi tr ca bin c t false thnh true xc nh mt gi tr c t vo trong queue. Ch gi tr ca bin c c s dng nh th no trong method get() v method put() c thread gi method ch cho n khi c mt gi tr trong queue hoc khng c gi tr no trong queue, ph thuc vo method no ang c gi. Class Publisher cng b mt instance ca class Queue v sau gi method put() t vo nm s nguyn integer trong queue. Mc d method put() c t trong mt vng lp for, mi s nguyn integer c t vo trong queue, v sau c mt khong tm dng cho n khi s nguyn integer c nhn bi class Consumer. Class Consumer tng t nh thit k class Publisher, ngoi tr class Consumer gi method get() nm ln bn trong mt vng lp for. Mi ln gi, method get() tm dng cho n khi class Publisher t mt s nguyn integer vo trong queue. Method main() ca class Demo to ra cc instance ca class Publisher, class Consumer v class Queue. Ch rng cc khi dng ca ca class Publisher v class Consumer u t vo mt reference n instance ca class Queue. Chng s dng instance ca class Queue cho inter-process communication. Di y l nhng g m bn s thy khi chy chng trnh v m ngun ca v d Put: 0 Get: 0 Put: 1 Get: 1 Put: 2 Get: 2 Put: 3 Get: 3 Put: 4 Get: 4 class Queue { int exchangeValue; boolean busy = false; synchronized int get() { 22

if (!busy) try { wait(); } catch (InterruptedException e) { System.out.println( "Get: InterruptedException"); } System.out.println("Get: " + exchangeValue); notify(); return exchangeValue; } synchronized void put (int exchangeValue) { if (busy) try { wait(); } catch (InterruptedException e) { System.out.println( "Put: InterruptedException"); } this.exchangeValue = exchangeValue; busy = true; System.out.println("Put: " + exchangeValue); notify(); } } class Publisher implements Runnable { Queue q; Publisher(Queue q) { this.q = q; new Thread (this, "Publisher").start(); } public void run() { for (int i = 0; i < 5; i++){ q.put(i); } } } class Consumer implements Runnable { Queue q; Consumer (Queue q) { 23

this.q = q; new Thread (this, "Consumer").start(); } public void run() { for (int i = 0; i < 5; i++){ q.get(); } } } class Demo { public static void main(String args []) { Queue q = new Queue (); new Publisher (q); new Consumer (q); } }

24

Chng V - Multithread trong Java(C th c nhiu ln bn mun dng tm thi mt thread ang x l v sau phc hi li x l, chng hn nh bn mun mt thread khc s dng ti nguyn hin thi. Bn c th t c mc ch ny bng vic nh ngha nhng method suspend v resume ca chnh bn nh c ch ra trong v d di y) I - Suspending v Resuming Thread V d ny nh ngha mt class MyThread. Class MyThread nh ngha ba method: method run(), method suspendThread(), v method resumeThread(). Thm vo , class MyThread cng b bin instance suspended, m gi tr c s dng ch ra thread c suspend hay khng. Method run() cha mt vng lp for hin th gi tr ca bin counter. Mi ln bin counter c hin th, thread dng mt khong thi gian.Sau l mt pht biu synchronized xc nh gi tr ca bin instance suspended l true hay khng. Nu c, method wait() c gi, lm cho thread i vo trng thi suspend cho n khi method notify() c gi. Method suspendThread() n gin ch gn gi tr true cho bin instance suspended. Method resumeThread() gn false cho bin instance suspended v sau gi method notify(). iu ny s lm cho thread ang trng thi suspend phc hi x l. Method main() ca class Demo cng b mt instance ca MyThread v sau tm dng khong 1 giy trc khi gi method suspendThread() v hin th thng ip tng ng trn mn hnh. Sau n li tm dng mt khong thi gian trc khi gi method resumeThread() v hin th thng ip tng ng trn mn hnh mt ln na. Thread tip tc hin th gi tr ca bin m counter cho n khi thread i vo trng thi suspend. Thread tip tc hin th gi tr ca bin counter mt khi thread phc hi x l. y l nhng g hin th khi bn chy chng trnh ny v m ngun Thread: 0 Thread: 1 Thread: 2 Thread: 3 Thread: 4 Thread: Suspended Thread: Resume Thread: 5 Thread: 6 Thread: 7 Thread: 8

25

Thread: 9 Thread exiting. class MyThread implements Runnable { String name; Thread t; boolean suspended; MyThread() { t = new Thread(this, "Thread"); suspended = false ; t.start(); } public void run() { try { for (int i = 0; i < 10; i++) { System.out.println("Thread: " + i ); Thread.sleep(200); synchronized (this) { while (suspended) { wait(); } } } } catch (InterruptedException e ) { System.out.println("Thread: interrupted."); } System.out.println("Thread exiting."); } void suspendThread() { suspended = true; } synchronized void resumeThread() { suspended = false; notify(); } } class Demo { public static void main (String args [] ) { MyThread t1 = new MyThread(); try{ 26

Thread.sleep(1000); t1.suspendThread(); System.out.println("Thread: Suspended"); Thread.sleep(1000); t1.resumeThread(); System.out.println("Thread: Resume"); } catch ( InterruptedException e) { } try { t1.t.join(); } catch ( InterruptedException e) { System.out.println ("Main Thread: interrupted"); } } }

27

Chng VI - S dng thread trong Swing nh th no ?(Phn ny tho lun v hai cch th hin s dng thread. u tin, chng ta tho lun v cc thread nh cch chng p dng cho mi ng dng Swing, ti sao tt c m vi nhng thnh phn khc nhau cn phi thc thi trn mt thread c th. Chng ta cng tho lun v cc method invokeLater v invokeAndWait, c s dng chc chn m thc thi trn thread c th ny. Phn cn li p dng ch cho nhng ai mun s dng thm cc thread hon thin kh nng thc thi trong ng dng ca h.) I - Event-dispatching thread (Thread gi i s kin) X l s kin v thc thi m Swing trong mt thread, gi l event-dispatching thread. iu ny chc chn rng mi x l s kin kt thc vic thc thi trc khi thc thi mt s kin k tip v v li component khng b gy bi cc s kin. trnh kh nng to ra deadlock, bn phi cc k cn thn rng cc component Swing v cc m hnh c to ra, c chnh sa, c truy vn ch t eventdispatching thread. Bn cng ch rng demo s dng mt phng thc chun main gi method invokeLater ca SwingUtilities chc chn rng GUI c to ra trn eventdispatching thread. y l mt v d ca method main t v d FocusConceptsDemo. Chng ta cng c c ngun ca method createAndShowGUI m mi method gi vic to GUI c x l. /* * To GUI v hin th n. thread an ton, * phng thc ny nn c gi t event-dispatching thread */ private static void createAndShowGUI() { //Chc chn rng chng ta to mt ca s tt JFrame.setDefaultLookAndFeelDecorated(true); //To v ci t mt ca s frame = new JFrame("FocusConceptsDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //To v ci t mt content Pane JComponent newContentPane = new FocusConceptsDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Hin th ca s 28

frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //To v hin th ng dng GUI javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } II - S dng method invokeLater Bn c th gi invokeLater t bt k thread no yu cu event-dispatching thread chy m ca bn. Bn phi t m ny trong method run ca i tng Runnable v xc nh i tng Runnable nh mt i s ca invokeLater. Method invokeLater tr v trc tip, m khng phi ch i event-dispatching thread thc thi m. y l v d vic s dng invokeLater

Runnable updateAComponent = new Runnable() { public void run() { component.doSomething(); } }; SwingUtilities.invokeLater(updateAComponent);

III - S dng method invokeAndWait Method invokeAndWait cng tng t nh method invokeLater, ngoi tr invokeAndWait khng tr v cho n khi event-dispatching thread thc thi m c th. Tt hn ht, bn nn s dng method invokeLater thay v method invokeAndWait bi rt d dng gy ra mt deadlock nu s dng invokeAndWait. Nu bn s dng invokeAndWait, chc chn rng thread gi invokeAndWait khng nm gi bt k kha no nhng thread khc c th cn trong khi method gi n ang thc thi.

public void showHelloThereDialog() throws Exception { Runnable showModalDialog = new Runnable() { public void run() { JOptionPane.showMessageDialog(myMainFrame, "Hello There"); } 29

}; SwingUtilities.invokeAndWait(showModalDialog); } Tng t, mt thread cn truy cp n trng thi GUI, chng hn nh mt cp text fields, c th c m di y void printTextField() throws Exception { final String[] myStrings = new String[2]; Runnable getTextFieldText = new Runnable() { public void run() { myStrings[0] = textField0.getText(); myStrings[1] = textField1.getText(); } }; SwingUtilities.invokeAndWait(getTextFieldText); System.out.println(myStrings[0] + " " + myStrings[1]); } IV - S dng thread hon chnh kh nng thc thi Khi c s dng ng, thread c th l mt cng c y sc mnh. Tuy nhin, bn phi x l cn thn khi s dng thread trong mt chng trnh Swing. Mc d nguy him, thread c th l v gi. Bn c th s dng chng hon thin kh nng thc thi ca chng trnh ca bn. V thnh thong, thread c th n gin m hoc kin trc ca mt chng trnh. y l mt vi v tr thng thng m thread c s dng. * di chuyn mt tc nhim khi to lng ph thi gian lkhi thread main, GUI c th hin th nhanh hn. V d thi gian lng ph ca cc tc nhim nh tnh ton hay kha mng hoc nhp xut. * g b mt tc nhim khi to lng ph thi gian khi event-dispatching thread, GUI tr li nhanh hn * thc thi mt hnh ng lp li, thng s dng nhiu khong thi gian gia cc hnh ng . * ch cc thng ip gi t cc chng trnh khc Nu bn cn to ra thread, bn c th trnh mt vi ci by thng thng bng vic b sung thread vi mt lp tin ch nh SwingWorker hay mt lp Timer. Mt i tng SwingWorker to ra mt thread thc thi hnh ng lng ph thi gian. 30

Sau khi hnh ng ny kt thc, SwingWorker cho bn la chn thc thi cc on m khc trong event-dispatching thread. Timer hu dng trong vic thc thi mt tc nhim lp li hoc sau mt khong ch xc nh. Nu bn cn b sung thread ca ring bn, bn c th tm thm thng tin lm trong cc sch thread khc. Bn c th s dng nhng k thut khc to nn nhng chng trnh Swing multi-thread lm vic tt: * Nu bn cn cp nht mt component nhng m ca bn khng thc thi mt event listener, s dng invokeLater ( ngh) hoc invokeAndWait * Nu bn khng chc chn rng m ca bn ang thc thi mt event listener, bn nn phn tch m ca chng trnh v ti liu to thread mi method c gi * Nu bn cn cp nht mt component sau mt khong thi gian, s dng mt Timer lm iu * Nu bn cn cp nht mt component vo mt thi im xc nh, s dng mt Timer Mt v d: Chng ti cung cp cho cc bn mt v d c th so snh vic to cm quan nu khng dng thread v nu dng thread khc nhau th no Gi s bn c cc menuItem m khi click vo th s thay i cm quan t Windows sang Unix hay ngc li.

private static final String macLaF = "com.sun.java.swing.plaf.mac.MacLookAndFeel"; private static final String metalLaF = "javax.swing.plaf.metal.MetalLookAndFeel"; private static final String motifLaF = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; private static final String gtkLaF = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; /** * A utility function that set look and feels * @param lookAndFeel */ private void createLookAndFeel(String lookAndFeel) { try { UIManager.setLookAndFeel(lookAndFeel); } catch(Exception exception) {} javax.swing.SwingUtilities.updateComponentTreeUI(frame); } 31

Nu bn khng s dng thread th s metalItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { createLookAndFeel(metalLaF); } }); Cn nu s dng thread metalItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createLookAndFeel(metalLaF); } }); } }); Bn s thy r rng, nu s dng thread, cc component khi c v li khng h b git hay hin th khng ng b nh lc khng dng thread. Kt thc article ny, bn c th thy c li ch ca thread trong Swing. N gip tng tc cng nh kh nng thc thi m ca ng dng. Hy vng l cc bn s nm bt c im mnh cng nh im yu ca thread trong Swing.

32