Kĩ thuật lập trình - Chương 4: Lập trình đa tiểu trình

pdf 23 trang vanle 1640
Bạn đang xem 20 trang mẫu của tài liệu "Kĩ thuật lập trình - Chương 4: Lập trình đa tiểu trình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfki_thuat_lap_trinh_chuong_4_lap_trinh_da_tieu_trinh.pdf

Nội dung text: Kĩ thuật lập trình - Chương 4: Lập trình đa tiểu trình

  1. Chương 4: LẬP TRÌNH ĐA TIỂU TRÌNH Khoa CNTT ĐH GTVT TP.HCM Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 1 / 23
  2. Nội dung 1 Giới thiệu 2 Lập trình multithread 3 Giải quyết tương tranh (xung đột) & Đồng bộ hóa Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 2 / 23
  3. Giới thiệu Concurrency * Máy tính ngày này cho phép ta sử dụng một lúc nhiều ứng dụng, chẳng hạn như bạn vừa nghe nhạc, vừa đánh văn bản word, vừa download nhạc * Hay thậm chí là một ứng dụng đơn cũng thực hiện nhiều task ở cùng một thời điểm. * Ví dụ, trình soạn thảo văn bản word, nó luôn luôn sẵn sàng đáp ứng các sự kiện về keyboard và mouse, nó vừa phải reformat text và cập nhật lại màn hình. * Các phần mềm làm những task như vậy gọi là phần mềm đồng bộ. Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 3 / 23
  4. Multithread Processes và Thread * Trong một tiến trình (process) có thể có nhiều threads chạy đồng thời. * Các threads chia sẽ cùng một tài nguyên của tiến trình, bao gồm bộ nhớ và các file, * Điều này làm cho giao tiếp hiệu quả nhưng lại tiềm ẩn bên trong nó các vấn đề về xử lý tranh chấp tài nguyên giữa các threads. Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 4 / 23
  5. Multithread Minh họa Multithread Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 5 / 23
  6. Multithread Tạo thread: Implements interface Runnable public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello froma thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } } Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 6 / 23
  7. Multithread Tạo thread: Extends class Thead public class HelloThread extends Thread { public void run() { System.out.println("Hello froma thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } } Question Khi nào implements Runnable, còn khi nào extends Thread? Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 7 / 23
  8. Multithread Thread bao gồm các trạng thái sau (1): * New: sau khi tạo thread * Runnable: sau khi start() → thread chuyển sang trạng thái Runnable * Blocked: thread ở trạng thái blocked nếu: 1 Gọi sleep(); 2 Thread gọi 1 thao tác mà nó đang bị block trên IO 3 Thread cố gắng dành lock - khóa (trong khi khóa này đang được giữ bởi thread khác) 4 Thread đợi 1 điều kiện nào đó để thực thi Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 8 / 23
  9. Multithread Thread bao gồm các trạng thái sau (2): * Dead (terminated): thread ở trạng thái này khi: 1 Thực thi xong phương thức run() 2 Xảy ra 1 exception chưa được catch Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 9 / 23
  10. Multithread Thread bao gồm các trạng thái sau (3): Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 10 / 23
  11. Multithread Yield, Sleep & Wait * Yield: This static method is essentially used to notify the system that the current thread is willing to "give up CPU" for a while. Thread scheduler will select a different thread to run. * Sleep: pauses the current thread for a given period of time (millisecond). Sleep can be interrupted. * Wait: means it will blocked until notify() or notifyAll() is called. Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 11 / 23
  12. Multithread Thread Scheduler & Priority * Scheduler à một thành phần của JVM, có vai trò quyết định thread nào sẽ chạy (dựa trên độ ưu tiên của thread). * Priority có giá trị từ 1 đến 10, giá trị mặc định là 5. Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 12 / 23
  13. Tương tranh (race condition) Khi nào xảy ra tương tranh? * Tương tranh xảy ra khi có hai hay nhiều thread cùng tranh giành truy cập vào tài nguyên chung của chương trình, trong khi tài nguyên chung này đòi hỏi phải được truy cập theo trình tự. * Đoạn mã lệnh bên trong một thread gây ra tình huống tương tranh được gọi là đoạn mã tới hạn (critical section). * Có thể tránh được tình huống tương tranh bằng cách đồng bộ hóa các đoạn mã tới hạn một cách đúng đắn, sao cho tài nguyên chung không được phép truy cập đồng thời bởi nhiều hơn 1 thread. Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 13 / 23
  14. Tương tranh (race condition) Minh họa Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 14 / 23
  15. Tương tranh (race condition) public class BanVeXeBuyt implements Runnable { private int soGheTrong = 2; @Override public void run() {KhachThread khach = (KhachThread) Thread.currentThread(); boolean datDuoc = this.banVe(khach.laySoGheDat(), khach.getName()); if (datDuoc == true){"Chuc mung"+ System.out.println(Thread.currentThread().getName() +","+ khach.laySoGheDat() +" ghe da duoc dat."); } else {System.out.println("Xin loi"+ Thread.currentThread().getName() +" khong du so ghe yeu cau (" + khach.laySoGheDat() +")"); } } // Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 15 / 23
  16. Tương tranh (race condition) // private boolean banVe(int soGheDat, String hoTen) { System.out.println("Chao mung" + hoTen +" so ghe trong la:"+ this.laySoGheTrong()); if (soGheDat > this.laySoGheTrong()) { return false; } else{ soGheTrong = soGheTrong - soGheDat; return true; } } private int laySoGheTrong() { return soGheTrong; } } Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 16 / 23
  17. Tương tranh (race condition) public class KhachThread extends Thread { private int soGheDat; public KhachThread(int gh, Runnable daiLy, String hoTen) { super(daiLy, hoTen); this.soGheDat = gh; } public int laySoGheDat() { return soGheDat; } } //in main method: BanVeXeBuyt bus = new BanVeXeBuyt(); KhachThread nam = new KhachThread(2, bus,"Nam"); KhachThread binh = new KhachThread(2, bus,"Binh"); nam.start(); binh.start(); Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 17 / 23
  18. Tương tranh (race condition) Kết quả Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 18 / 23
  19. Đồng bộ (Synchronization) Synchronized method private synchronized boolean banVe(int soGheDat, String hoTen) { System.out.println("Chao mung" + hoTen +" so ghe trong la:"+ this.laySoGheTrong()); if (soGheDat > this.laySoGheTrong()) { return false; } else{ soGheTrong = soGheTrong - soGheDat; return true; } } Synchronized block private boolean banVe(int soGheDat, String hoTen) { synchronized(this){/*critical section*/} } Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 19 / 23
  20. Đồng bộ (Synchronization) Kết quả sau khi synchronized Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 20 / 23
  21. Tương tranh (race condition) Sử dụng ReentrantLock (java.util.concurrent.locks.ReentrantLock) Lock lock = new ReentrantLock(); lock.lock(); //critical section lock.unlock(); Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 21 / 23
  22. Tương tranh (race condition) Difference between Lock Interface and synchronized keyword * Having a timeout trying to get access to a synchronized block is not possible. Using Lock.tryLock(long timeout, TimeUnit timeUnit), it is possible. * The synchronized block must be fully contained within a single method. A Lock can have it’s calls to lock() and unlock() in separate methods. Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 22 / 23
  23. —Hết— Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 23 / 23