You are on page 1of 8

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

Mobilesprogramming's Blog
JAVA | SYMBIAN | ANDROID

Tm hiu Thread trong JAVA Phn 4


Bi 4: ng b ha(Synchronized) Thread Khi nhiu thread cng tng tc vi mt i tng, bn cn phi iu khin chng mt cch cn thn trnh tranh chp ti nguyn. Bi ny gii thiu nhng vn c gii thiu cc li thng gp trong ng dng ca bn, khi no v lm th no s dng t kha synchronized iu khin vic truy cp vo cc i tng v cc bin cng mt thi im. Vic b xung t kha synchronized vo khai bo phng thc nhm m bo ch c mt thread c php bn trong phng thc ti mt thi im. Trc khi bn hc cch lm th no nh ngha mt method ng b ha trong chng trnh ca bn, hy xem nhng g xy ra nu vic ng b ho khng c s dng trong mt chng trnh. V d 1: m phng 2 thread cng truy cp ng thi vo mt phng thc ca cng mt i tng. 1: public class BothInMethod extends Object { 2: 3: 4: 5: 6: 7: 8: 9: 10: public void doStuff(int val) { print(entering doStuff()); int num = val * 2 + objID.length();
1/8

private String objID;

public BothInMethod(String objID) { this.objID = objID; }

mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

11: 12: 13: 14:

print(in doStuff() local variable num= + num);

// slow things down to make observations try { Thread.sleep(2000); }

catch ( InterruptedException x ) { } 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: }
2/8

print(leaving doStuff()); }

public void print(String msg) { threadPrint(objID= + objID + + msg); }

public static void threadPrint(String msg) { String threadName = Thread.currentThread().getName(); System.out.println(threadName + : + msg); }

public static void main(String[] args) { final BothInMethod bim = new BothInMethod(obj1);

Runnable runA = new Runnable() { public void run() { bim.doStuff(3);

mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

35: 36: 37: 38: 39: 40:

};

Thread threadA = new Thread(runA, threadA); threadA.start();

try { Thread.sleep(200); }

catch ( InterruptedException x ) { } 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: } Trong phng thc main(), i tng BothInMethod c khi to vi mt identifier l obj1(dng 29). Tip theo, 2 thread c to ra truy cp ng thi vo phng thc doStuff(). Thread u tin c tn l threadA, ci th hai l threadB. Sau khi threadA bt u(dng 38), n gi doStuff() v truyn vo gi tr 3(dng 33). Khong 200 mili giy sau, threadB c bt u v gi phng thc doStuff() trn cng mt i tng v truyn vo gi tr 7. C threadA v threadB cng trong phng thc doStuff()(t dng 8->17) ti cng mt thi im; threadA vo trc, sau 200 mili giy th threadB vo. Bn trong doStuff(), bin cc b num c tnh ton thng qua tham s val v bin thnh vin objID(dng 10). Bi v, threadA v threadB u gn mt bin val khc nhau, nn gi tr bin num s khc nhau cho mi thread. Phng thc sleep() c s dng trong doStuff() nhm lm chm li m bo rng c hai thread u trong cng mt phng thc ca cng mt i tng mt cch ng thi.
mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/ 3/8

Runnable runB = new Runnable() { public void run() { bim.doStuff(7); } };

Thread threadB = new Thread(runB, threadB); threadB.start(); }

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

Lu : Nu hai hay nhiu thread u trong mt phng thc ng thi, th mi thread phi c mi bo sao chp cc bin cc b. Kt qu t v d trn: threadA: objID=obj1 entering doStuff() threadA: objID=obj1 in doStuff() local variable num=10 threadB: objID=obj1 entering doStuff() threadB: objID=obj1 in doStuff() local variable num=18 threadA: objID=obj1 leaving doStuff() threadB: objID=obj1 leaving doStuff() 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. Nh chng ta bit, khi nim semaphore (monitor c Tony Hoare xut) thng c s dng iu khin ng b cc hot ng truy cp vo nhng ti nguyn dng chung. Mt lung mun truy cp vo mt ti nguyn dng chung (nh bin d liu) th trc tin n phi yu cu c c monitor ring. Khi c c monitor th lung nh c c cha kha m ca vo min tranh chp (ti nguyn dng chung) s dng nhng ti nguyn . C ch monitor thc hin hai nguyn tc ng b chnh: Khng mt lung no khc c phn monitor khi c mt lung yu cu v ang chim gi. Nhng lung c yu cu monitor s phi ch cho n khi monitor c gii phng. Khi c mt lung gii phng (ra khi) monitor, mt trong s cc lung ang ch monitor c th truy cp vo ti nguyn dng chung tng ng vi 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. Trong lp trnh c hai cch thc hin ng b: Cc hm (hm) c ng b Cc khi c ng b 1.Cc hm c ng b(synchronized method) Nu method c ng b ho l mt instance method(phn bit vi static method i vi class), th method c ng b ha s kch hot lock i km vi i tng ca phng thc . Ngc li, nu method c ng b ha l static th n kch hot lock i km vi class nh ngha method
mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/ 4/8

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

c ng b ho. V d 2: M phng s dng t kha synchronized, v ch c mt thread trong mt phng thc ti mt thi im. 1: public class OnlyOneInMethod extends Object { 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: // slow things down to make observations try { Thread.sleep(2000); } public synchronized void doStuff(int val) { print(entering doStuff()); int num = val * 2 + objID.length(); print(in doStuff() local variable num= + num); } public OnlyOneInMethod(String objID) { this.objID = objID; private String objID;

catch ( InterruptedException x ) { } 15: 16: 17: 18: 19: 20: 21: 22:
mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/ 5/8

print(leaving doStuff()); }

public void print(String msg) { threadPrint(objID= + objID + + msg); }

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:

public static void threadPrint(String msg) { String threadName = Thread.currentThread().getName(); System.out.println(threadName + : + msg); }

public static void main(String[] args) { final OnlyOneInMethod ooim = new OnlyOneInMethod(obj1);

Runnable runA = new Runnable() { public void run() { ooim.doStuff(3); } };

Thread threadA = new Thread(runA, threadA); threadA.start();

try { Thread.sleep(200); }

catch ( InterruptedException x ) { } 41: 42: 43: 44: 45: 46: };


6/8

Runnable runB = new Runnable() { public void run() { ooim.doStuff(7); }

mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

47: 48: 49: 50: 51: } v d trn, ta thy trong phng thc doStuff() ch c mt thread ti mt thi im; threadA i vo(dng 1) v i ra(dng 3) khi phng thc doStuff() trc khi threadB c php vo(dng 4). Vic s dng modifier synchronized bo v phng thc doStuff() v ch cho php mt thread trong n ti mt thi im. Di y l kt qu ca v d 2, bn c th so snh kt qu ca v d 1 thy s khc bit. threadA: objID=obj1 entering doStuff() threadA: objID=obj1 in doStuff() local variable num=10 threadA: objID=obj1 leaving doStuff() threadB: objID=obj1 entering doStuff() threadB: objID=obj1 in doStuff() local variable num=18 threadB: objID=obj1 leaving doStuff() 2.Cc khi c ng b(synchronized statement block) Cc khi c ng b c th c s dng khi ton b phng thc khng cn synchronized hoc khi mun nhn lock trn mt i tng khc. Cch s dng n nh sau: synchronized(obj){ // block code } V d: class Client{ BankAccount account; // public void updateTransaction(){
mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/ 7/8

Thread threadB = new Thread(runB, threadB); threadB.start(); }

19/07/2012

Tm hiu Thread trong JAVA Phn 4 Mobilesprogramming's Blog

synchronized(account){ account.update(); } } } // (2)

// (1) Khi ng b

Ngoi ra, c th s dng statement block thay th cho phng thc c synchronized nh sau: public synchronized void setPoint(int x, int y) { this.x = x; this.y = y; } Thay th bng statement block nh sau: public void setPoint(int x, int y) { synchronized ( this ) { this.x = x; this.y = y; } } Bn thy bi vit ny th no? Cc bi lin quan: Tm hiu Thread trong JAVA-Phn 3 Tm hiu Thread trong JAVA-Phn 5 08/11/2010 mobilesprogramming Categories: Thread Tags: java thread Blog at WordPress.com. | Theme: Dark Wood by Nischal Maniar.

mobilesprogramming.wordpress.com/2010/08/11/tim-hiu-thread-trong-java-phn-4/

8/8

You might also like