Chapter 6 Threads in Java 1 Objectives Multitasking
Chapter 6 Threads in Java 1
Objectives Multitasking vs Multi. Threading Define a thread Define multithreading List benefits of multithreading Create threads Discuss thread states Manage threads Explain how to set thread priorities Describe a daemon thread Java Simplified / Session 22 / 2 of 2 45
Một số khái niệm Multitasking: § là khả năng của một OS cho phép chạy nhiều chương trình đồng thời trên một CPU (đơn nhân) § Thực hiện bằng cách phân bổ thời gian chuyển hoạt động từ một chương này sang chương trình khác (ms). Process § Khi chạy 1 ứng dụng (program) OS sẽ cấp phát riêng cho nó bộ nhớ và các tài nguyên khác -> 1 process. § Các bộ nhớ và các tài nguyên của 1 process chỉ nó mới được phép truy nhập Thread: § Một process có thể có một hoặc nhiều tác vụ khác nhau và có thể chạy đồng thời. § Mỗi tác vụ là một thread Java Simplified / Session 22 / 3 of 3 45
Thread Thread là đơn vị nhỏ nhất trong mã chương trình có thể thực thi một công việc riêng biệt. Thread hình thành gồm: § một định danh luồng (thread ID), § một bộ đếm chương trình, § tập thanh ghi và ngăn xếp. Nó chia sẻ với các luồng khác thuộc cùng một tiến trình phần mã, phần dữ liệu, và tài nguyên hệ điều hành như các tập tin đang mở và các tín hiệu. Java Simplified / Session 22 / 4 of 4 45
Multi. Thread Truyền thống: Một tiến trình có một luồng điều khiển đơn: Chỉ có một tuyến đoạn đang chạy tại một thời điểm cho trước. Các tuyến đoạn khác phải chờ. § Hệ điều hành duy trì một hàng đợi các tuyến đoạn và phân bổ thời gian CPU cho chúng § Gây lãng phí CPU và bộ nhớ Hiện đại: Một tiến trình có nhiều luồng điều khiển, nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm. Khi đó, các tuyến đoạn có thể truy xuất tới tài nguyên dùng chung để cùng làm việc hợp tác với nhau => Multi. Threads Java Simplified / Session 22 / 5 of 5 45
Single vs. Multi-Threaded Java Simplified / Session 22 / 6 of 6 45
Single vs. Multi-Threaded • A process that is made of one thread is known as single-threaded process. Step 1 Step 2 … Step n • A process that creates two or more threads is called a multithreaded process. Step 1 Step 2 … Step n Java Simplified / Session 22 / 7 of 7 45
Applications of Multithread n n Web Browser IE: Thread hiện thị hình ảnh, văn bản; Thread lấy dữ liệu từ mạng… Word: Thread hiện thị đồ họa; Thread đọc sự nhấn phím của NSD; Thread kiểm tra chính tả… Java Simplified / Session 22 / 8 of 8 45
Applications of threads Thread cũng đóng một vai trò quan trọng trong hệ thống lời gọi thủ tục xa (RPC). Khi một trình phục vụ nhận một thông điệp, nó phục vụ thông điệp dùng một thread riêng. Điều này cho phép phục vụ nhiều yêu cầu đồng hành. Ứng dụng mạng trong lập trình mạng Java Simplified / Session 22 / 9 of 9 45
Benefits of Multithreading Sự đáp ứng: § đa luồng một ứng dụng giao tiếp cho phép một chương trình tiếp tục chạy thậm chí nếu một phần của nó bị khóa (wait) hay đang thực hiện một thao tác dài, § do đó gia tăng sự đáp ứng đối với người dùng. . Chia sẻ tài nguyên: § Mặc định, các luồng chia sẻ bộ nhớ và các tài nguyên của các quá trình mà chúng thuộc về. § Thuận lợi của việc chia sẻ là nó cho phép một ứng dụng có nhiều hoạt động của các luồng khác nhau nằm trong cùng không gian địa chỉ. Java Simplified / Session 22 / 10 of 10 45
Benefits of Multithreading Kinh tế: § cấp phát bộ nhớ và các tài nguyên cho việc tạo các quá trình là rất đắt. § Vì các luồng chia sẻ tài nguyên của quá trình mà chúng thuộc về nên nó kinh tế hơn để tạo và chuyển ngữ cảnh giữa các luồng. Sử dụng kiến trúc đa xử lý: § các lợi điểm của đa luồng có thể phát huy trong kiến trúc đa xử lý, ở đó mỗi luồng thực thi song trên một bộ xử lý khác nhau. § Một quá trình đơn luồng chỉ có thể chạy trên một CPU. Đa luồng trên một máy nhiều CPU gia tăng tính đồng hành. Java Simplified / Session 22 / 11 of 11 45
Multithreading vs. multitasking Multithreading requires less overhead than multitasking. § In multitasking, các tiến trình chạy trên các không gian địa chỉ của chúng và khác nhau giữa các tiến trình üđòi hỏi nhiều tài nguyên của hệ thống (cả ram và CPU) § In multithreading các tác vụ có thể chia sẻ cùng không gian địa chỉ Multithreading cho phép viết các chương trình có hiệu quả cao với sự tận dụng CPU là tối đa bằng cách duy trì thời gian trễ là tối thiểu. Java Simplified / Session 22 / 12 of 12 45
Hai loại Thread nhân: § Được hỗ trợ trực tiếp bởi hệ điều hành. § Nhân thực hiện việc tạo luồng, lập thời biểu, và quản lý không gian nhân. Thread người dùng: § Được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng tại cấp người dùng. § Việc tạo luồng và lập thời biểu được thực hiện trong không gian người dùng mà không cần sự can thiệp của nhân. Java Simplified / Session 22 / 13 of 13 45
Thread in Java là một trong số nhỏ ngôn ngữ cung cấp sự hỗ trợ tại cấp ngôn ngữ cho việc tạo và quản lý luồng. Tuy nhiên, vì các luồng được quản lý bởi máy ảo Java (JVM), không bởi một thư viện cấp người dùng hay nhân. Một chương trình Java có ít nhất 1 Thread, nó được gọi thực hiện khi phương thức main chạy (như một luồng đơn trong máy ảo Java) -> Main Thread. § Ngoài ra, Java cung cấp các lệnh cho phép người phát triển tạo và thao tác các luồng điều khiển bổ sung trong chương trình Java Simplified / Session 22 / 14 of 14 45
Six states of Thread Every Thread has a state and a Thread can be in one of these six states. § new. A state in which a thread has not been started. § runnable. A state in which a thread is executing. § blocked. A state in which a thread is waiting for a lock to access an object. § waiting. A state in which a thread is waiting indefinitely for another thread to perform an action. § timed__waiting. A state in which a thread is waiting for up to a specified period of time for another thread to perform an action. § terminated. A state in which a thread has exited. Java Simplified / Session 22 / 15 of 15 45
The New Thread State Tạo tuyến đoạn mới: Thread new. Thread = new Thread(“thread. Name“); Kích hoạt đoạn tuyến khởi động new. Thread. start(); Khi tuyến đoạn ở trạng thái New thì chỉ có phương thức start() được gọi, nếu không sẽ có ngoại lệ Illegal. Thread. State. Exception được đưa ra Java Simplified / Session 22 / 16 of 16 45
The Runnable thread state Một tuyến đoạn ở trạng thái runnable mỗi khi phương thức start() của nó được kích hoạt. Điều này nghĩa là mã lệnh trong phương thức run() có thể được xử lý bất kỳ khi nào giành được quyền xử lý từ hệ điều hành. Java Simplified / Session 22 / 17 of 17 45
The not Runnable Thread State Một tuyến đoạn ở not runnable state (blocked) khi: Phương thức sleep() của tuyến đoạn được gọi: Tuyến đoạn sẽ tạm dừng sau một số ms xác định. Tuyến đoạn gọi phương thức wait() của một đối tượng: Tuyến đoạn sẽ not runnable cho tới khi phương thức notify() hoặc notify. All() được gọi từ một tuyến đoạn khác. Tuyến đoạn bị blocked() bởi một thao tác vào/ra. Tuyến đoạn sẽ not runnable cho tới khi hoạt động vào ra hoàn thành. Java Simplified / Session 22 / 18 of 18 45
The Dead Thread State A thread có thể dead or alive. § Dead khi phương thức run() hoàn thành việc xử lý. § Dead khi gán giá trị null cho đối tượng Phương thức is. Alive(): xác định một thread còn sống hay ko Một thread ở trạng thái dead không thể được khởi động lại. Java Simplified / Session 22 / 19 of 19 45
Different thread states New Thread (BORN) READY SLEEPING RUNNING WAITING BLOCKED DEAD Java Simplified / Session 22 / 20 of 20 45
Main Thread • Mỗi khi chạy một ứng dụng trong java thì đã có một thread. • Đây là thread chính, nó thực thi các dòng lệnh trong method : public static void main. Đây là một điểm nhập bắt buộc cho mọi ứng dụng độc lập. main thread : Tuyến đoạn đầu tiên thực hiện trong ứng dụng đa tuyến đoạn, được tạo ra tự động Java Simplified / Session 22 / 21 of 21 45
Main Thread • current. Thread(): phương thức được dùng để truy nhập vào main thread. public static void main(String args[]) { Thread t= Thread. current. Thread(); System. out. println(" The current thread: " + t); t. set. Name("Main. Thread"); System. out. println(“The current thread after name change: ”+ t); … } Java Simplified / Session 22 / 22 of 22 45
Create Thread Có thể 2 cách: § Extend the java. lang. Thread class override the run() method of the Thread class. § Implement the java. lang. Runnable interface define the run() method. Java Simplified / Session 22 / 23 of 23 45
Dùng Thread class Lớp java. lang. Thread cung cấp các phương thức quản lý, kiểm soát độ ưu tiên của tuyến đoạn : § khởi động (start()), § tạm dừng (suspend()), § phục hồi (resume()) và § dừng hẳn (stop()). Để sử dụng lớp Thread là thừa kế lớp này và nạp chồng phương thức run(): § Nó được gọi khởi động tuyến đoạn lần đầu. § Một tuyến đoạn có thể thực hiện một số tác vụ hữu ích ở hậu trường Java Simplified / Session 22 / 24 of 24 45
Dùng Thread class Th_ex extends Thread { public void run() {. . . } public static void main(String args[]){ Th_ex T = new Th_ex(); //Kích hoạt đoạn tuyến khởi động T. start(); } } Java Simplified / Session 22 / 25 of 25 45
Thread class, ex public class Hello. Thread extends Thread { public void run() { System. out. println("Hello from athread"); } public static void main(String args[]) { (new Hello. Thread()). start(); } } Java Simplified / Session 22 / 26 of 26 45
Some methods of thread class void start(): Gọi một thread khởi động final boolean is. Alive(): kiểm tra thread còn chạy không. final String get. Name(): trả về tên của thread. final void set. Name(String name): thiết đặt tên cho thread Java Simplified / Session 22 / 27 of 27 45
Thread ex public void run() { class My. Thread extends Thread while(true) { { try { public static void main(String args[]) System. out. println("This is { My. Thread Objex = new My. Thread(); the child thread"); Thread. sleep(500); Objex. start(); } System. out. println("This is the main thread"); catch(Interrupted. Exception e) } {} } Java Simplified / Session 22 / 28 of 28 45
Ex Multi. Thread Objth 1. start(); Objth 2. start(); class My. Thread extends Thread Objth 3. start(); { public static void main(String args[]) } public void run() { { while (true) { My. Thread Objex = new My. Thread(); try { //Add more threads or: System. out. println("This is Objex. create(); the child thread"); System. out. println("This is the Thread. sleep(1000); main thread"); } } catch(Interrupted. Exception e) public void create() {} { } Thread Objth 1 = new Thread(this); } Thread Objth 2 = new Thread(this); Thread Objth 3 = new Thread(this); } Java Simplified / Session 22 / 29 of 29 45
Ex Multi. Thread Mỗi Thread tạo ra đều thực thi các tác vụ giống nhau (theo run()) Muốn mỗi Thread thực hiện một tác vụ khác nhau? § Tạo constructor, giá trị truyền vào khác nhau § Tao methods cho mỗi thread § Tạo các thread ở các class khác nhau, viết run() riêng cho mỗi thread. Tạo nhiều thread bằng mảng Java Simplified / Session 22 / 30 of 30 45
ex class Tich. Tac extends Thread { catch(Interrupted. Exception e) String word; { int delay; System. out. print("Stop ct"); Tich. Tac(String s, int d) return; { } word =s; } delay=d; public static void main(String[] args) } { public void run() { new Tich. Tac("Tich", 330). start(); try { new Tich. Tac("Tac", 1000). start(); while (true) { new Tich. Tac(“tac", 500). start(); System. out. println(word+" } "); } sleep(delay); } } Java Simplified / Session 22 / 31 of 31 45
Multi. Thread, ex public class Thread_ex extends Thread{ String name; Thread_ex (String name){ this. name = name; } public static void main(String args[]) { Thread_ex Objex 1 = new Thread_ex("Thr 1"); Thread_ex Objex 2 = new Thread_ex("Thr 2"); Thread_ex Objex 3 = new Thread_ex("Thr 3"); Objex 1. start(); Objex 2. start(); Objex 3. start(); System. out. println("This is the main thread"); } public void run() { if (name=="Thr 1") t 1(); else if (name=="Thr 2") t 2(); else t 3(); } public void t 1() public void t 2() public void t 3() Java Simplified / Session 22 / 32 of 32 45
Multi. Thread using array class arr. Thread extends Thread { … public void run(){…} } arr. Thread[] worker = new arr. Thread[num]; //New Thread for (int i = 0; i < num; i++) worker[i] = new arr. Thread( i ); //Start Thread for (int i = 0; i < num; i++) worker[i]. start(); Java Simplified / Session 22 / 33 of 33 45
Multi. Thread using array ex, public static void main(String[] args) throws private static class Tinh Interrupted. Exception { extends Thread { int id; Scanner new{ Scanner (System. in); public. Text. IO Tinh(int= id) int num. Threads = 0; this. id = id; } System. out. print(“Input threads: (from 1 to 20)"); public void run() { num. Threads = Text. IO. next. Int(); long start. Time = System. current. Time. Millis(); System. out. println("n. Creating " + num. Threads + " int count = count. Even(1, 1000000); Even-counting threads. . . "); long Time = System. current. Time. Millis() - start. Time; } System. out. println("Thread " + id + " counted " + count +worker " Evens=innew " + Tinh[num. Threads]; (Time/1000. 0) + " seconds. "); Tinh[] } for (int i = 0; i < num. Threads; i++) { worker[i] = new Tinh( i ); worker[i]. start(); } } Java Simplified / Session 22 / 34 of 34 45
Dùng Interface Runnable § định nghĩa duy nhất một phương thức run(). § Các lớp thực thi giao tiếp này chỉ ra rằng chúng có thể chạy độc lập như một tuyến đoạn riêng. § Báo hiệu các lớp thực thi giao tiếp này có thể chạy như các tuyến đoạn. § Có thể thừa kế từ một lớp khác - đa kế thừa § Cùng một đối tượng Runnable có thể được truyền cho nhiều tuyến đoạn, vì vậy một số tuyến đoạn tương tranh có thể sử dụng chung mã và thao tác trên cùng dữ liệu. Java Simplified / Session 22 / 35 of 35 45
Dùng Interface Runnable class C 2 implements Runnable { public C 2() {Thread t = new Thread(this); } public void run(){. . . } } Java Simplified / Session 22 / 36 of 36 45
Runnable, ex public class Hello. Runnable implements Runnable { public void run() { System. out. println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new Hello. Runnable())). start(); } } Java Simplified / Session 22 / 37 of 37 45
Interface Runnable class Run_ex { public static void main(String[] args) throws Interrupted. Exception Runnable run. A = new Runnable() { public void run() { //statements }; Thread ta = new Thread(run. A, "thread. A"); ta. start(); } Java Simplified / Session 22 / 38 of 38 45
Ex, multi. Thread public class ex { public static void main(String[] args) throws Interrupted. Exception { Runnable a = new Runnable (){ @Override public void run() { System. out. println("AAAAA"); } }; Runnable b = new Runnable (){ @Override public void run() { System. out. println("BBBBB" ); } }; Runnable c = new Runnable (){ @Override public void run() { System. out. println("CCCCCC"); } }; //Tao 3 Threads ta, tb, tc Thread ta = new Thread(a, "thread. A"); ta. start(); Thread. sleep(1000); Thread tb = new Thread(b, "thread. B"); tb. start(); Thread. sleep(1000); Thread tc = new Thread(c, "thread. C"); tc. start(); Thread. sleep(1000); } } Java Simplified / Session 22 / 39 of 39 45
Some methods of thread class final void join() throws Interrupted. Exception: làm cho thread gọi join() phải ngưng hoạt động và chờ trong một khoảng thời gian, hoặc đến khi thread này kết thúc thì mới tiếp tục hoạt động Mean: another thread calls thrd. join(), that other thread will go to sleep until thrd terminates. If thrd is already dead when thrd. join() is called, then it simply has no e�ect Java Simplified / Session 22 / 40 of 40 45
Some methods of thread class final void join() throws Interrupted. Exception Ex: System. out. print("Running the thread "); thrd. start(); while (thrd. is. Alive()) { try { thrd. join(2000); System. out. print(". "); } catch (Interrupted. Exception e) { } } System. out. println(" Done!"); Java Simplified / Session 22 / 41 of 41 45
Some methods of thread class Java Simplified / Session 22 / 42 of 42 45
Some methods of thread class static void yield(): giành lấy quyền thực thi của tuyến đoạn hiện hành cho một trong các tuyến đoạn khác (sleep). static int active. Count(): trả về số thread đang active. static void sleep(): đưa tiến đoạn hiện hành vào trạng thái nghỉ tối thiểu là ms (milis) Java Simplified / Session 22 / 43 of 43 45
Multi. Thread trong Applet - ex Hiện thị giá trị number giảm dần: 100 ->1 (extend: Hình ảnh đồng hồ đếm ngược) File Thread_App_ex. java Java Simplified / Session 22 / 44 of 44 45
Synchronization Consider a simple class called Counter class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } } Java Simplified / Session 22 / 45 of 45 45
Synchronization The single expression c++ can be § Retrieve the current value of c. § Increment the retrieved value by 1. § Store the incremented value back in c. Ex, Thread A invokes increment at about the same time Thread B invokes decrement. If the initial value of c is 0, § Thread A: Retrieve c. § Thread B: Retrieve c. § Thread A: Increment retrieved value; result is 1. § Thread B: Decrement retrieved value; result is -1. § Thread A: Store result in c; c is now 1. § Thread B: Store result in c; c is now -1. Java Simplified / Session 22 / 46 of 46 45
Synchronization Khi làm việc với nhiều Thread, có thể có một số Thread muốn sử dụng cùng tài nguyên tại cùng 1 time. § Khi hai tuyến đoạn cần sử dụng cùng một đối tượng, có một khả năng có các thao tác đan xen nhau làm phá hỏng dữ liệu => Race condition. ex, Cần phải có sự đồng bộ - Synchronization. exp, § Tại một time t chỉ có 1 thread sử dụng tài nguyên. § Monitor: Chỉ có 1 Thread có được monitor tại 1 time. Các Thread khác muốn có được monitor phải chờ đợi. Java Simplified / Session 22 / 47 of 47 45
Method synchronized() Sử dụng phương thức chiếm dụng đối tượng: § Nếu một đối tượng bị phong tỏa (used) bởi một tuyến đoạn nào đó thì chỉ có tuyến đoạn đó mới được truy cập tới đối tượng. Nếu một tuyến đoạn kích hoạt một phương thức synchronized trên một đối tượng, đối tượng đó sẽ bị chiếm dụng bởi tuyến đoạn kích hoạt. Khi đối tượng được giải phóng, một tuyến đoạn khác mới được kích hoạt synchronized trên cùng đối tượng synchronized(Obj); Note that constructors cannot be synchronized Java Simplified / Session 22 / 48 of 48 45
Ex, Test. Unsyn. java Consider a simple class called Counter class Counter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public int value() { return c; } } Java Simplified / Session 22 / 49 of 49 45
Lệnh synchronized cho phép đồng bộ hóa một đối tượng thay cho phương thức synchronized Cú pháp synchronized (expr) { //this code will execute in one thread at //a time and some. Object will be locked. } Java Simplified / Session 22 / 50 of 50 45
Lệnh synchronized, ex Ex 1: synchronized (color) { int my. Color. Int = color. get. RGB(); //may be another thread invoke color. set() String my. Color. Name = color. get. Name(); } Ex 2: synchronized(tsc) { if ( tsc. get. Value() == 0 ) do. Something(); } Java Simplified / Session 22 / 51 of 51 45
Methods: wait , notify Cơ chế chiếm dụng đồng bộ hóa ngăn cho các tuyến đoạn chồng chéo nhau. Các tuyến đoạn vẫn có thể trao đổi thông tin với nhau, sử dụng các phương thức: § wait(): cho phép một tuyến đoạn đợi cho tới khi một điều kiện nào đó xảy ra § notify(): báo cho các tuyến đoạn biết sự kiện nào đó đã xảy ra Các phương thức này được định nghĩa trong lớp Object và được thừa kế từ các lớp Object. Java Simplified / Session 22 / 52 of 52 45
Methods: wait , notify public final void wait(long timeout) throws Interrupted. Exception: § Tuyến đoạn hiện thời chờ cho tới khi được cảnh báo hoặc một khoảng thời gian timeout nhất định. § Nếu timeout bằng 0 thì phương thức sẽ chỉ chờ cho tới khi có cảnh báo về sự kiện. public final void notify() § Cảnh báo ít nhất một tuyến đoạn đang chờ một điều kiện nào đó thay đổi trước khi có thể gọi phương thức wait nào đó. public final void notify. All() § Cảnh báo tất cả các tuyến đoạn đang chờ một điều kiện thay đổi § Trong số các tuyến đoạn đã được cảnh báo, tuyến đoạn nào có độ ưu tiên cao nhất thì sẽ chạy trước tiên. Java Simplified / Session 22 / 53 of 53 45
Synchronization Java Simplified / Session 22 / 54 of 54 45
Ex: wait , notify publicclass void Wait_Noti run() { extends Thread { public static void main(String args[]) throws System. out. println (" Click enter to stop Exception { waiting thread"); Thread noti. Thread = new Wait_Noti(); try { noti. Thread. start(); // cont to run() System. in. read(); // wait thread an event execute System. out. println ("Stop"); synchronized (noti. Thread) } catch (java. io. IOException ioe) { noti. Thread. wait(7000); { System. out. println (" Over"); } } Notify any threads waiting on this thread // //synchronized wait() is done (this) { System. out. println ("The wait is over"); this. notify. All(); } } 55 Java Simplified / Session 22 / 55 of 45
Ex: Synchonized with wait, notify Bài toán Producer – Consumer. § Product: ü set(i) üget § Producer: set Product § Consumer: get Product Java Simplified / Session 22 / 56 of 56 45
Ex, Non Synchnozied public class Synch_ex { public class Product { private int view = 0; public boolean is. Remainingview; public int get() { //print onto screen System. out. println("t. Consumer get " + this. view); return view; } public void set(int piview) { this. view = piview; System. out. println(“Producer set" + this. view); } } //end class Product public class Producer extends Thread { private Product sp; Producer(Product p. Product) { sp = p. Product; } public void run() { for(int i = 0; i < 10; i++) { sp. set(i); try { Thread. sleep(500); } catch (Interrupted. Exception e) { } }//end class Producer Java Simplified / Session 22 / 57 of 57 45
Ex, cont public class Consumer extends Thread { private Product sp; Consumer(Product p. Product) { sp = p. Product; } public void run() { for(int i = 0; i < 10; i++) { sp. get(); try { Thread. sleep(500); } catch (Interrupted. Exception e) { } }//end class Consumer public static void main(String[] args) { Synch_ex t = new Synch_ex (); Product s = t. new Product(); //2 thread cung dung chung doi tuong s thuoc class Product Producer p = t. new Producer(s); Cosumer c = t. new Consumer(s); p. start(); c. start(); } }//end class Synch_ex Java Simplified / Session 22 / 58 of 58 45
Ex, Synchronized (syncho_full. java) public synchronized void set(int piview ) { while(is. Remaining. Contents == true) { try { wait(); } catch (Interrupted. Exception e) { } } this. view = piview; is. Remaining. Contents = true; is. Remaining. Contents = false; //print onto screen System. out. println("t. Consumer get " System. out. println(“Producer set " + this. view); //Notify Consumer get this view //Notify Producer to produce new notify. All(); view } notify. All(); } return view; } public synchronized int get() { while(is. Remaining. Contents == false) { try { wait(); } catch (Interrupted. Exception e) { } } Java Simplified / Session 22 / 59 of 59 45
Thread PRIORITY Java gán cho mỗi tuyến đoạn một độ ưu tiên để xác định cách tuyến đoạn đó được xử lý như thế nào so với các tuyến đoạn khác. Mỗi thread mới thừa kế quyền ưu tiên mà thread đã tạo ra nó. A thread with a greater priority value will be run in preference to a thread with a smaller priority Hằng số: § public static final int MIN_PRIORITY = 1; § public static final int NORM_PRIORITY = 5; § public static final int MAX_PRIORITY = 10; Java Simplified / Session 22 / 60 of 60 45
Thread PRIORITY Phương thức: § set. Priority(): thiết lập độ ưu tiên của tuyến đoạn hiện thời § get. Priority(). nhận về độ ưu tiên của một tuyến đoạn § public static void sleep(long ms) throws Interrupted. Exception đưa tiến đoạn hiện hành vào trạng thái nghỉ tối thiểu là ms (mili giây). Ex , Piority_Demo. java Java Simplified / Session 22 / 61 of 61 45
Bế tắc-Deadlock Deadlock: § Một kiểu lỗi đặc biệt cần phải tránh có liên quan đến đa nhiệm, § Xảy ra khi hai tuyến đoạn có một sự phụ thuộc xoay vòng trên một cặp đối tượng đồng bộ. § Ví dụ, một tuyến đoạn chiếm dụng đối tượng X và một tuyến đoạn chiếm dụng đối tượng Y. ü Nếu tuyến đoạn chiếm dụng X cố gắng gọi bất kỳ phương thức đồng bộ trên Y, thì nó sẽ bị phong tỏa. ü Nếu tuyến đoạn chiếm dụng Y gọi phương thức đồng bộ trên X, tuyến đoạn sẽ chờ vô hạn. § Tuyến đoạn này chờ tuyến đoạn kia giải phóng đối tượng mà đối tượng kia đang bị chiếm dụng và ngược lại -> chờ đợi lẫn nhau (hoài vọng) Java Simplified / Session 22 / 62 of 62 45
Ex, Deadlock Cần hạn chế deadlock: § Đưa ra và cải tiến việc cấp phát, § thu hồi tài nguyên cho các thread § khá nhiều thuật toán cải tiến việc này deadlock_ex. java Java Simplified / Session 22 / 63 of 63 45
Interrupt a Thread Khi gọi phương thức Thread. sleep(int): đặt tuyến đoạn vào trạng thái nghỉ trong một khoảng thời gian xác định nào đó. Tuy nhiên để kích hoạt một tuyến đoạn sớm hơn ta phải sử dụng ngắt tuyến đoạn. § Phương thức interrupt(). § Cần một tuyến đoạn khác tham chiếu tới tuyến đoạn hiện thời. Java Simplified / Session 22 / 64 of 64 45
Ex: interrupt public class vd 1 extends Thread { //Run method is executed when thread first started public void run() { System. out. println ("I feel sleepy. Wake me in eight hours"); try { // Sleep for eight hours Thread. sleep( 1000*60 ); System. out. println ("That was a nice nap"); } catch (Interrupted. Exception ie) { System. err. println ("Just five more minutes. . "); } } //Main method to create and start threads public static void main(String args[]) throws java. io. IOException { // Create a 'sleepy' thread Thread sleepy = new vd 1(); // Start thread sleeping sleepy. start(); // Prompt user and wait for input System. out. println ("Press enter to interrupt the thread"); System. in. read(); // Interrupt the thread sleepy. interrupt(); } } Java Simplified / Session 22 / 65 of 65 45
Conditions thread not execute n If thread is: n Not of highest priority § Put to sleep using sleep() method § Is waiting because wait() method was called § Explicitly yielded using yield() method § Blocked for file I/O Java Simplified / Session 22 / 66 of 66 45
Stop a Thread Đôi khi cần thiết phải kết thúc một tuyến đoạn trước khi tác vụ của nó hoàn thành. § Phương thức Thread. stop(). § Đòi hỏi tuyến đoạn điều khiển duy trì một tham chiếu tới tuyến đoạn mà nó muốn dừng. Java Simplified / Session 22 / 67 of 67 45
Ex: stop Thread public class vd 1 extends Thread { // Run method is executed when thread first started public void run() { int count = 1; System. out. println ("I can count. Watch me go!"); for (; ; ) { // Print count and increment it System. out. print (count++ + " "); // Sleep for half a second try { Thread. sleep(1000); } catch(Interrupted. Exception ie) {} } } // Main method to create and start threads public static void main(String args[]) throws java. io. IOException { // Create and start counting thread Thread counter = new vd 1(); System. out. println ("Press any enter to stop the thread ounting"); counter. start(); // Prompt user and wait for input System. in. read(); // Interrupt the thread counter. stop(); } } Java Simplified / Session 22 / 68 of 68 45
Review: Cycle of Thread Java Simplified / Session 22 / 69 of 69 45
Thread. Group Khi cần phải xử lý với nhiều Threads -> cần phải tổ chức dạng mảng… -> việc xử lý nhiều. Nhóm các tuyến đoạn với nhau: áp dụng một thao tác trên nhóm mà không phải thực hiện thao tác trên từng tuyến đoạn riêng lẻ. Java API hỗ trợ khả năng làm việc với các nhóm tuyến đoạn nhờ lớp Thread. Group. § biểu diễn một tập hợp các tuyến đoạn, § và cung cấp các phương thức tác động nhanh trên từng tuyến đoạn riêng trong nhóm. § Nó còn cung cấp cách thức để tập hợp các thông tin về các tuyến đoạn có liên quan nói chung. § Nếu cần truy xuất tới từng tuyến đoạn riêng lẻ, ta có thể truy xuất thông qua Thread. Group. Java Simplified / Session 22 / 70 of 70 45
Thread. Group Constructor: § public Thread. Group(String name) throws java. lang. Security. Exception Tạo ra một nhóm tuyến đoạn mới, có tên được xác định bởi name. § Thread. Group(Thread. Group parent. Group, String name) throws java. lang. Security. Exception Tạo ra một nhóm tuyến đoạn mới name là nhóm con của Parent. Group Ex: Thread. Group parent = new Thread. Group("parent"); Thread. Group subgroup = new Thread. Group(parent, "sub"); Java Simplified / Session 22 / 71 of 71 45
Thread. Group Sử dụng một Thread. Group § Một nhóm tuyến đoạn có thể được sử dụng như một tuyến đoạn bình thường. § Ta có thể tạm dừng, phục hồi, ngắt hoặc dừng nhóm tuyến đoạn bằng cách gọi phương thức thích hợp. Các phương thức § int active. Count(): trả về số tuyến đoạn trong nhóm, và các nhóm con. § int active. Group. Count(): trả về số nhóm con các tuyến đoạn § boolean allow. Thread. Suspension(): chỉ ra tuyến đoạn bị tạm ngừng hay không. Java Simplified / Session 22 / 72 of 72 45
Ex: Thread. Group public class Group. Demo implements Runnable{ public static void main(String args[]) throws Exception { Thread. Group parent = new Thread. Group("parent"); Thread. Group subgroup = new Thread. Group(parent, "subgroup"); Thread t 1 = new Thread ( parent, new Group. Demo() ); t 1. start(); Thread t 2 = new Thread ( parent, new Group. Demo() ); t 2. start(); Thread t 3 = new Thread ( subgroup, new Group. Demo() ); t 3. start(); Thread t 4 = new Thread ( subgroup, new Group. Demo() ); t 4. start(); // Dump the contents of the group to System. out parent. list(); System. exit(0); } public void run(){ while (true) { Thread. yield(); } } } Java Simplified / Session 22 / 73 of 73 45
Daemon threads Two types of threads in Java: § User threads: created by the user § Daemon threads: threads that work in the background providing service to other threads üe. g. – the garbage collector thread When user thread exits, JVM checks to find out if any other thread is running. § If there are, it will schedule the next thread. § If the only executing threads are daemon threads, it exits. Why need Daemon Java Simplified / Session 22 / 74 of 74 45
Daemon threads Contd… We can set a thread to be a Daemon if we do not want the main program to wait until a thread ends. Thread class has two methods to deal with Daemon threads: § public final void set. Daemon(boolean value) : sets a thread to be a daemon thread § public final boolean is. Daemon() : checks if the given thread is a daemon thread Ex: Objex. is. Daemon() Java Simplified / Session 22 / 75 of 75 45
Daemon threads, ex class Test. Daemon implements Runnable { Thread Objth 1, Objth 2; public Test. Daemon() { Objth 1 = new Thread(this); Objth 1. start(); Objth 2 = new Thread(this); Objth 2. set. Daemon(true); } public void run() { System. out. println(Thread. active. Count()); System. out. println(Objth 1. is. Daemon()); System. out. println(Objth 2. is. Daemon()); } public static void main(String args[]) { new Test. Daemon(); } An example } Java Simplified / Session 22 / 76 of 45
Sử dụng Thread trong các chương trình Server Đa tuyến hay được ứng dụng trong các chương trình Server: § Đòi hỏi tại một thời điểm chấp nhận nhiều kết nối đến từ các Client và xử lý cho nhiều Client tai một thời điểm Mô hình Java Simplified / Session 22 / 77 of 77 45
Sử dụng Thread để gửi /nhận dữ liệu Ex, Chat theo TCP Java Simplified / Session 22 / 78 of 78 45
Summary Multithreading allows programmers to write efficient programs that make the maximum use of the CPU. Java provides built-in support for multithreading in the form of classes and interfaces. When Java programs are executed, there is already one thread that is running and it is the main thread. This main thread is important for two reasons: § It is the thread from which child threads will be created. § Program is terminated when the main thread stops execution. Thread objects can be created in two ways: § Declare the class to be a sub-class of the Thread class where we need to override the run() method of the Thread class. § Declare a class that implements the Runnable interface. Then define the run() method. Each thread in a Java program is assigned a priority, and the Java Virtual Machine never changes the priority of a thread. Java Simplified / Session 22 / 79 of 79 45
Summary Contd… The default priority of a thread that is created is 5. Two of the constructors in the Thread class are: § public Thread(String threadname) § public Thread( ) There are two types of threads in a Java program: User threads and Daemon threads § The threads created by the user are called user threads. § The threads that are intended to be "background" threads, providing service to other threads are referred to as daemon threads. The Thread class has two methods that deal with daemon threads. § public final void set. Daemon(boolean on) § public final boolean is. Daemon( ) Java Simplified / Session 22 / 80 of 80 45
- Slides: 80