1. Trang chủ
  2. » Thể loại khác

Java - profthinh ď Chuong4-Multithread

23 55 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 350,47 KB

Nội dung

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 / 23 Nội dung Giới thiệu Lập trình multithread Giải tương tranh (xung đột) & Đồng hóa Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Giới thiệu Concurrency * Máy tính ngày cho phép ta sử dụng lúc nhiều ứng dụng, chẳng hạn bạn vừa nghe nhạc, vừa đánh văn word, vừa download nhạc * Hay chí ứng dụng đơn thực nhiều task thời điểm * Ví dụ, trình soạn thảo văn word, ln ln sẵn sàng đáp ứng kiện keyboard mouse, vừa phải reformat text cập nhật lại hình * Các phần mềm làm task gọi phần mềm đồng Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Processes Thread * Trong tiến trình (process) có nhiều threads chạy đồng thời * Các threads chia tài nguyên tiến trình, bao gồm nhớ file, * Điều làm cho giao tiếp hiệu lại tiềm ẩn bên vấn đề xử lý tranh chấp tài nguyên threads Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Minh họa Multithread Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Tạo thread: Implements interface Runnable public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } } Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Tạo thread: Extends class Thead public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } } Question Khi implements Runnable, extends Thread? Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Thread bao gồm trạng thái sau (1): * New: sau tạo thread * Runnable: sau start() → thread chuyển sang trạng thái Runnable * Blocked: thread trạng thái blocked nếu: Gọi sleep(); Thread gọi thao tác mà bị block IO Thread cố gắng dành lock - khóa (trong khóa giữ thread khác) Thread đợi điều kiện để thực thi Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Thread bao gồm trạng thái sau (2): * Dead (terminated): thread trạng thái khi: Thực thi xong phương thức run() Xảy exception chưa catch Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Thread bao gồm trạng thái sau (3): Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 10 / 23 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 Multithread Thread Scheduler & Priority * Scheduler thành phần JVM, có vai trò định thread chạy (dựa độ ưu tiên thread) * Priority có giá trị từ đến 10, giá trị mặc định Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 12 / 23 Tương tranh (race condition) Khi xảy tương tranh? * Tương tranh xảy có hai hay nhiều thread tranh giành truy cập vào tài nguyên chung chương trình, tài nguyên chung đòi hỏi phải truy cập theo trình tự * Đoạn mã lệnh bên thread gây tình tương tranh gọi đoạn mã tới hạn (critical section) * Có thể tránh tình tương tranh cách đồng hóa đoạn mã tới hạn cách đắn, cho tài nguyên chung không phép truy cập đồng thời nhiều thread Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 13 / 23 Tương tranh (race condition) Minh họa Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 14 / 23 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 Tương tranh (race condition) // private boolean banVe(int soGheDat, String hoTen) { System.out.println("Chao mung " + hoTen + " so ghe 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 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 Tương tranh (race condition) Kết Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 18 / 23 Đồng (Synchronization) Synchronized method private synchronized boolean banVe(int soGheDat, String hoTen) { System.out.println("Chao mung " + hoTen + " so ghe 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 Đồng (Synchronization) Kết sau synchronized Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 20 / 23 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 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 —Hết— Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 23 / 23 ... tranh chấp tài nguyên threads Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Minh họa Multithread Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Tạo thread: Implements... thao tác mà bị block IO Thread cố gắng dành lock - khóa (trong khóa giữ thread khác) Thread đợi điều kiện để thực thi Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Thread bao gồm... exception chưa catch Khoa CNTT (ĐH GTVT TP.HCM) Java Programming / 23 Multithread Thread bao gồm trạng thái sau (3): Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 10 / 23 Multithread Yield, Sleep

Ngày đăng: 11/12/2017, 19:49

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w