Bài giảng Lập trình Java (Java Programming) - Chương 4: Lập trình đa tiểu trình

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.

pdf 23 trang phuongnguyen 4880
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình Java (Java Programming) - Chương 4: Lập trình đa tiểu trình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình Java (Java Programming) - Chương 4: Lập trình đa tiểu trình

Bài giảng Lập trình Java (Java Programming) - Chương 4: Lập trình đa tiểu trình
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
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
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
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
Multithread
Minh họa Multithread
Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 5 / 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 6 / 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 nào implements Runnable, còn khi nào extends Thread?
Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 7 / 23
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
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
Multithread
Thread bao gồm các 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 à 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
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
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 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
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 quả
Khoa CNTT (ĐH GTVT TP.HCM) Java Programming 18 / 23
Đồ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
Đồng bộ (Synchronization)
Kết quả sau khi 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

File đính kèm:

  • pdfbai_giang_lap_trinh_java_java_programming_chuong_4_lap_trinh.pdf