intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình Java căn bản - Chương 9 THREADS

Chia sẻ: Nguyễn Doãn Mạnh Đoàn | Ngày: | Loại File: PDF | Số trang:25

60
lượt xem
5
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Quá trình (process) là trạng thái tức thời của một chương trình đang chạy trên máy tính. Nó bao gồm bộ nhớ cần thiết để chạy chương trình (không gian địa chỉ của quá trình) và khả năng kiểm soát hiện trạng của bộ xử lý trong quá trình thực thi chương trình (tiến trình điều khiển của quá trình).

Chủ đề:
Lưu

Nội dung Text: Lập trình Java căn bản - Chương 9 THREADS

  1. Chương 9- THREADS M c tiêu Sau chương này b n có th Đ nh nghĩa ñư c lu ng (thread) là gì. Hi u ña lu ng là gì? Bi t cách t o lu ng trong Java. Hi u v nhu c u ñ ng b (synchronize) các lu ng. Bi t cách dùng wait() và notify() ñ giao ti p gi a các lu ng. 1
  2. N i dung 9.1- Ôn t p. 9.2- Lu ng và ña lu ng 9.3- Lu ng trong Java 9.4- Tr ng thái c a lu ng 9.5- L p trình lu ng trong Java 9.6- Đ ưu tiên c a lu ng 9.7- Đ ng b gi a các lu ng 9.8- Deadlock 9.9- Cơ ch Ch -nh n bi t 9.10- Tóm t t 9.1- Ôn t p Gói AWT cung c p các l p cho ta xây d ng GUI nhưng các l p này s d ng các h tr ph thu c platform. L p Graphics và Graphics2D trong gói AWT cho ta các công c v hình và xu t file nh. L p Applet và JApplet cung c p kh năng t o các ng d ng nh c a Java nhúng vào trang Web và chúng ñư c th c thi trong Browser. appletviewer cho phép ch y m t Java applet mà không c n ñ n Browser. 2
  3. 9.2- Lu ng và ña lu ng Lu ng- thread: M t dòng các l nh mà CPU ph i th c thi. Các h ñi u hành m i cho phép nhi u lu ng ñư c th c thi ñ ng th i. Chúng ta ñã quen v i vi c m nhi u ng d ng trong 1 l n làm vi c v i máy tính Nhi u ng d ng ñư c n p. Như v y – M t lu ng là m t chu i các l nh n m trong b nh ( chương trình ñã ñư c n p). – 1 application thông thư ng khi th c thi là 1 lu ng. – Trong 1 application có th có nhi u lu ng. Thí d chuy n ñ ng c a 10 ñ i tư ng hi n hành trong 1 trò chơi là 10 lu ng. K thu t ña lu ng V i máy có m CPU ch y m lu ng M i CPU ch y 1 lu ng Hi u qu . V i máy có m CPU ch y n lu ng v i n>> m M i CPU ch y n/m lu ng. V i 1 CPU ch y ñ ng th i k lu ng v i k>1. Các lu ng ñư c qu n lý b ng 1 hàng ñ i, m i lu ng ñư c c p phát th i gian mà CPU th c thi là ti (cơ ch time-slicing – phân chia tài nguyên th i gian). Lu ng ñ nh hàng ñ i ñư c l y ra ñ th c thi trư c, sau ti th i gian c a mình, lu ng này ñư c ñưa vào cu i hàng ñ i và CPU l y ra lu ng k ti p. V i máy ch có 1 CPU mà l i ch y k lu ng Hi u su t m i chương trình s kém. 3
  4. L i ích c a ña lu ng Tăng hi u su t s d ng CPU: Ph n l n th i gian th c thi c a 1 ng d ng là ch ñ i nh p li u t user hi u su t s d ng CPU chưa hi u q a. T o ñư c s ñ ng b gi a các ñ i tư ng: Thí d như trong 1 trò chơi, các nhân v t cùng nhau chuy n ñ ng. Trong 1 trang Web, t o ñư c s ñ ng th i c a các ñư ng di m (marquee) như thanh tiêu ñ ñ ng (banner, ch , nh ch y), v a hi n th ñ ng h , v a phát nh c, v a chơi game, v a ho t nh (animated images),… Trang Web th t b t m t (eye-catching) và quy n rũ (captivating). Qu n lý ñư c th i gian trong các ng d ng như thi online, th i gian chơi m t trò chơi. 9.3- Lu ng trong Java Main thread - lu ng chính : là lu ng ch a các lu ng khác. Đây chính là lu ng cho Java. Application hi n hành (m c toàn application). Child thread - lu ng con : là lu ng ñư c t o ra t lu ng khác. Khi 1 application th c thi, main thread ñư c ch y, khi g p các phát bi u phát sinh lu ng con, các lu ng con ñư c kh i t o. Vào th i ñi m lu ng chính k t thúc, application k t thúc. Java cung c p l p Thread mô t 1 lu ng trong gói java.lang 4
  5. 9.4- Tr ng thái c a lu ng Sinh ra (Born) H t th i gian ng new Thread() S n sàng ( Ready ) notify() notify() start() Đang ch Ng 1 lúc B t m hoãn B khóa ( Waiting ) ( Sleeping ) ( Suspended ) ( Blocked ) run() wait() sleep() wait() Đang ch y ( Running ) khi ch các bi n stop() hay ch y xong c như xu t/nh p Hành vi ñ bu c Đã ch t lu ng chuy n ( Dead ) tr ng thái Tr ng thái c a lu ng M t lu ng sau khi sinh ra (born) không ñư c ch y ngay mà ch là s n sàng (ready) ch y. Ch khi nào phương th c start() ñư c g i thì lu ng m i th c thi (ch y code phương th c run()). Lu ng ñang th c thi có th b t m ngưng b ng phương th c sleep() m t th i kho ng và s l i ready sau khi ñáo h n th i gian. Lu ng ñang ng không s d ng tài nguyên CPU. Khi nhi u lu ng cùng ñư c th c thi, n u có 1 lu ng gi tài nguyên mà không nh ra s làm cho các lu ng khác không dùng ñư c tài nguyên này (ñói tài nguyên). Đ tránh tình hu ng này, Java cung c p cơ ch Wait- Notify(ñ i-nh n bi t) và cơ ch này ñư c trình bày m c sau. Phương th c wait() giúp ñưa 1 lu ng vào tr ng thái ch . 5
  6. Tr ng thái c a lu ng Khi m t lu ng b t m ngưng hay b treo, lu ng rơi vào tr ng thái t m hoãn (suspended). Phương th c suspend()- version cũ/ wait() trong Java 2 dùng cho m c ñích này. Khi 1 suspended thread ñư c mang ra th c thi ti p, tr ng thái c a lu ng là resumed. Phương th c resume() – version cũ/ notify() trong Java 2 ñ c dùng cho m c ñích này. Khi 1 lu ng ch bi n c như xu t/nh p d li u. Lu ng rơi vào tr ng thái blocked. Khi 1 lu ng th c thi xong phương th c run() hay g p phương th c stop(), ta nói lu ng ñã ch t (dead). 9.5- L p trình lu ng trong Java Cách 1: Xây d ng 1 l p con c a l p java.lang.Thread, override hành vi run() ñ phù h p v i m c ñích bài toán. Cách 2: Xây d ng 1 l p có hi n th c interface Runnable – Không c n import java.lang vì là gói cơ b n. – java.lang.Thread là l p Java xây d ng s n ñã hi n th c interface Runnable. – Interface java.lang.Runnable ch có 1 method run() – Tham kh o thêm trong gói java.lange 6
  7. Tham kh o l p Thread 9.5.1- T o lu ng là l p con c a l p Thread class MyThread extends Thread { // d li u + hành vi c a l p public void run() { // hi n th c code ph thu c bài toán } } 7
  8. 9.5.2- T o lu ng v i interface Runnable class MyThread implements Runnable { // d li u + hành vi c a l p public void run() { // hi n th c code ph thu c bài toán } } 9.5.3- Kh i t o và th c thi 1 lu ng MyThread t = new MyThread(); // t o 1 lu ng t.start(); // ch th cho lu ng th c thi Hành vi start() s t ñ ng g i hành vi run() 8
  9. 9.5.4- Thread Constructors Thread () Thread (Runnable target) Thread (Runnable target, String Name) Thread (String Name) Thread (ThreadGroup group, Runnable target) Thread (ThreadGroup group, Runnable target, String Name) Thread (ThreadGroup group, Runnable target, String Name, long stacksize) Thread (ThreadGroup group, String Name) target : lu ng cha name: tên g i c a lu ng ñư c t o ra 9.5.5- Hai lo i lu ng Lu ng Daemon: lu ng h th ng, ch y m c n n (background- ch y ng m), là nh ng lu ng cung c p các d ch v cho các lu ng khác. Các quá trình trong JVM ch t n t i khi các lu ng daemon t n t i. JVM có ít nh t 1 lu ng daemon là lu ng “garbage collection” Lu ng do user t o ra. 9
  10. 9.5.6- Methods thông d ng c a l p Thread Method M c ñích static int enumerate (Thread Sao chép các lu ng ñang ho t ñ ng [] t) (active) vào 1 m ng t các nhóm lu ng và nhóm con c a chúng. final String getName() L y tên c a lu ng final boolean isAlive() Ki m tra lu ng còn s ng hay không? final void setName( String Đ t tên m i cho lu ng NewName) final void join () throws Ch lu ng này ch t interruptedException public final boolean Ki m tra xem lu ng này có ph i là isDaemon() lu ng daemon void setDaemon(boolean on) on=true : lu ng là daemon on=false : lu ng c a user 9.5.6- Methods thông d ng c a l p Thread Method M c ñích static void sleep (long Trì hoãn lu ng 1 th i gian milisec) void start() th c thi lu ng static int activeCount() Đ m s lu ng ñang ho t ñ ng static void yield() T m d ng lu ng hi n hành ñ các lu ng khác ti p t c th c thi 10
  11. Minh h a t o lu ng v i l p Thread // Thread1.java – Minh h a t o lu ng v i l p Thread class Thread1 extends Thread { public void Create() // t o lu ng con c a lu ng cha hi n hành { Thread t = new Thread (this); t.start(); } public void run() // override hành vi run() { System.out.println("This is child thread."); } public static void main (String args[]) { System.out.println("This is main thread."); Thread1 t= new Thread1(); t.Create(); // t o lu ng con K t q a: } This is main thread } This is child thread Pres any key to continue Minh h a t o lu ng v i l p interface Runnable class Thread2 implements Runnable Khi xây d ng lu ng b ng { public void Create() interface Runable, ph i khai báo 1 ñ i tư ng { Thread t = new Thread(this); Thread và g i hành vi t.start(); start() ñ hành vi này g i run() } public void run() // implement the run () method { System.out.println("This is child thread."); } public static void main (String args[]) { System.out.println("This is main thread."); Thread2 t= new Thread2(); t.Create(); } K t q a: } This is main thread This is child thread Pres any key to continue 11
  12. MInh h a m t s methods c a Thread class Thread3 implements Runnable // Thread3.java { Thread t1,t2; Thread3() { t1= new Thread(this); K t q a là 4 lu ng t1.start(); // t1 is an user-defined thread t2= new Thread(this); tích c c : lu ng gom t2.setDaemon(true); // t2 is a daemon thread rác, lu ng m và 2 } lu ng t1,t2. public void run() { int n= Thread.activeCount(); // Đ m s lu ng ñang tích c c trong JVM System.out.println("Number of active threads:" + n); String t1Name = t1.getName(); // l y tên c a 2 lu ng String t2Name = t2.getName(); System.out.println("Name of t1 thread:" + t1Name); K t qu System.out.println("Name of t2 thread:" + t2Name); This is main thread. System.out.println("Is t1 thread a daemon? :" + t1.isDaemon()); Number of active threads:4 System.out.println("Is t2 thread a daemon? :" + t2.isDaemon()); Name of t1 thread:Thread-1 System.out.println("Is t1 thread alive? :" + t1.isAlive()); Name of t2 thread:Thread-2 System.out.println("Is t2 thread alive? :" + t2.isAlive()); Is t1 thread a daemon? :false } Is t2 thread a daemon? :true public static void main (String args[]) Is t1 thread alive? :true { System.out.println("This is main thread."); Is t2 thread alive? :false Thread3 t= new Thread3(); Press any key to continue... } } Tên m c ñ nh c a lu ng là Thread-n, v i n là s th t khi lu ng ñư c t o ra Minh h a v tr ng thaí c a lu ng class Thread4 extends Thread// // Thread4.java { Thread t; Thread4() { t= new Thread(this); System.out.println("t thread is born and ready."); t.start(); } public void run() { try { System.out.println("t thread is running."); t.sleep(5000); System.out.println("t is awaked and running again after 5 secs."); } catch( InterruptedException e) Dòng này xu t sau 5 giây { System.out.println("thread is interrupted!"); so v i dòng trư c } } public static void main (String args[]) t thread is born and ready. { new Thread4(); t thread is running. t is awaked and running again after 5 secs. } Press any key to continue... } 12
  13. 9.6- Đ ưu tiên c a lu ng Các lu ng cùng chia s th i gian c a CPU Lu ng cu i hàng ñ i s lâu ñư c CPU th c thi Có nhu c u thay ñ i ñ ưu tiên c a lu ng. Java cung c p 3 h ng mô t ñ ưu tiên c a 1 lu ng (các ñ ưu tiên khác dùng 1 s nguyên t 1.. 10). NORM_PRIORITY : mang tr 5 MAX_PRIORITY : mang tr 10 MIN_PRIORITY : mang tr 1 Đ ưu tiên m c ñ nh c a 1 lu ng là NORMAL_PRIORITY. Lu ng con có cùng ñ ưu tiên v i lu ng cha (do ñ c ñi m th a k ). Thao tác v i ñ ưu tiên c a lu ng final void setPriority( int newPriority) final int getPriority() Như v y, các ñi u ki n ñ 1 lu ng không ñư c th c thi: Lu ng không có ñư c ñ ưu tiên cao nh t ñ dành l y th i gian c a CPU. Lu ng b cư ng b c ng b ng hành vi sleep(). Lu ng b ch do hành vi wait(). Lu ng b tư ng minh nh n hành vi yield(). Lu ng b khóa vì ñang ch I/O 13
  14. Minh h a v ñ ưu tiên c a lu ng class Thread5 extends Thread// Thread4.java { public void run() { Thread Child = new Thread(this); Child.setName("Child thread"); System.out.println("Name of current thread:" + Thread.currentThread().getName()); System.out.println("Piority of current thread:" + Thread.currentThread().getPriority()); System.out.println("Name of child:" + Child.getName()); Name of current thread:Parent thread Piority of current thread:5 System.out.println("Priority of child:" + Name of child:Child thread Child.getPriority()); Priority of child:5 } Press any key to continue... public static void main (String args[]) { Thread5 t = new Thread5(); t.start(); N u trong main(), thêm dòng t.setPriority (8); trư c dòng t.start(); t.setName("Parent thread"); ta có k t q a là 8 thay vì 5 } } 9.7- Đ ng b các lu ng Tình hu ng: Có hai lu ng t1, t2 cùng truy xu t 1 ñ i tư ng d li u là bi n m. t1 mu n ñ c bi n m còn t2 mu n ghi bi n m. d li u mà t1 ñ c ñư c có th không nh t quán. N u ñ cho t2 ghi m trư c r i t1 ñ c sau thì t1 ñ c ñư c d li u nh t quán t i th i ñi m ñó. C n có cơ ch ñ ch cho phép 1 lu ng ñư c truy xu t d li u chung (shared data) t i 1 th i ñi m. K thu t này g i là “Đ NG B HÓA – SYNCHRONIZATION” 14
  15. K thu t cơ b n v ñ ng b hóa T o ra 1 ñ i tư ng qu n lý s ñ ng b c a 1 thao tác d li u c a các lu ng b ng cách th c thi h m t tác v c a các lu ng m i l n ch cho 1 lu ng b ng t khóa synchronized M i ñ i tư ng lu ng ñ u ñư c ñ i tư ng qu n lý này quan sát (MONITOR) b ng cách cho m i ñ i tư ng lu ng có d li u là ñ i tư ng monitor này và thay vì ph i làm 1 tác v thì nh ñ i tư ng monitor làm h ho c là 1 bi n boolean ñ nh n bi t ñã có 1 lu ng ñang th c thi. Lu ng ñang ñư c chi u c g i là lu ng ñang có monitor Minh h a v ñ ng b các lu ng b ng MONITOR Chương trình sau s xu t 3 s 10,11, 12 ra màn hình, m i s ñư c 1 lu ng th c thi. // Monitor1.java – L p làm nhi m v xu t h 1 s num class Monitor1 { synchronized void Display (int num) { System.out.println("Output " + num + " - done."); try { Thread.sleep(500); // current thread sleep 1/2 sec } catch (InterruptedException e) { System.out.println ("Thread is interrupted!"); } } } T khóa synchronized khai báo có qu n lý vi c ñ ng b các lu ng 15
  16. Minh h a v ñ ng b các lu ng b ng MONITOR class OutNum implements Runnable // lu ng { Monitor1 monitor; // Lu ng có d li u là monitor int number; // d li u c n xu t Thread t; // hành vi xu t n v i Monitor1 có tên moni OutNum(Monitor1 moni, int n ) { monitor= moni; number = n; t = new Thread(this); t.start(); } // khi lu ng ch y, s number ñư c xu t b i monitor public void run() { monitor.Display(number); } } Minh h a v ñ ng b các lu ng b ng MONITOR class Synchro // l p c a chương trình chính 3 lu ng có 3 tr { public static void main (String args[]) khác nhau là { Monitor1 monitor = new Monitor1(); 10,11, 12 nhưng int num = 10; có chung 1 OutNum Obj1 = new OutNum(monitor,num++); monitor Ba lu ng cùng OutNum Obj2 = new OutNum(monitor,num++); ñơ OutNum Obj3 = new OutNum(monitor,num++); // wait for 3 threads to end try { Obj1.t.join(); Output 10 - done. Obj2.t.join(); Output 11 - done. Obj3.t.join(); Output 12 - done. Press any key to continue.... } catch(InterruptedException e) { System.out.println ("Thread was interrupted!"); } } } 16
  17. K thu t ñ ng b lu ng theo kh i Đ ng b m t kh i tác v . Ngư i l p trình có th không mu n dùng các synchronized method ñ ñ ng b truy xu t ñ n ñ i tư ng. Các l p ñư c cung c p b i các thư vi n hay do “m t ai ñó” cung c p – l p ñã xây d ng- nên không th thêm t khóa synchonized vào ñư c các method này. K thu t ñ ng b lu ng theo kh i Cú pháp ñ ng b kh i synchronized (Object) { } Bu c ph i có { } dù ch có 1 phát bi u 17
  18. Minh h a ñ ng b kh i Chương trình sau vi t l i chương trình trư c, b qua t khóa synchronized trong l p Monitor1 ( ñây g i là l p Monitor2) class Monitor2 // Monitor2.java { void Display (int num) { System.out.println("Output " + num + " - done."); try { Thread.sleep(500); // current thread sleap 1/2 sec } catch (InterruptedException e) { System.out.println ("Thread is interrupted!"); } } } Minh h a ñ ng b kh i class Synchro { public static void main (String args[]) { Monitor2 monitor = new Monitor2(); int num = 10; OutNum Obj1 = new OutNum(monitor,num++); OutNum Obj2 = new OutNum(monitor,num++); OutNum Obj3 = new OutNum(monitor,num++); // wait for 3 threads to end try { Obj1.t.join(); Obj2.t.join(); Obj3.t.join(); } catch(InterruptedException e) { System.out.println ("Thread was interrupted!"); } } } 18
  19. Minh h a ñ ng b kh i class OutNum implements Runnable { Monitor2 monitor; int number; Thread t; OutNum(Monitor2 moni, int n ) { monitor= moni; number = n; t = new Thread(this); t.start(); } public void run() { synchronized (monitor) { monitor.Display(number); } } } Minh h a ñ ng b kh i 19
  20. 9.8- Deadlock Deadlock – tình hu ng b t c, ñóng băng- x y ra khi các lu ng ch tài nguyên (monitor) c a nhau hình thành m t chu trình. Deadlock hi m khi x y ra. Minh h a: DeadlockDemo.java Gi i thích DeadlockDemo class 1 ng d ng có 2 lu ng :Lu ng t1 trong ñ i tư ng d1, lu ng t2 trong ñ i tư ng d2 Monitor c a t1 l i là d2 và monitor c a t2 l i là d1 (tréo nhau). C 2 lu ng cùng g i hành vi synchronized run() và cùng ng 300 mili giây.Vì chia s th i gian CPU nên t1 ng trư c và t2 ng sau (xem phương th c run()). Khi t1 th c d y (wake up), phương th c Synchro() c a ñ i tư ng monitor c a d2 (ch a lu ng t2) ñư c g i nhưng lu ng t2 ñang ng nên phương th c này chưa th th c thi. Khi t2 th c d y (wake up), phương th c Synchro() c a ñ i tư ng monitor c a d1 (ch a lu ng t1) ñư c g i nhưng lu ng t1 cũng ñang ng nên phương th c này chưa th th c thi. Như v y chương trình s ñóng băng (blocked) không làm gì ñư c n a. 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2