CHƢƠNG 9 ĐA LUỒNG MULTITHREAD
9.4. Đồng bộ các Thread
Giao tiếp giữa các thread là một cơ chế trong đó thread bị tạm d ng và một thread khác được phép xen vào thực hiện. Nó được thực hiện bằng các phương thức sau của lớp Object:
public final void wait(): Chờ cho đến khi đối tượng được thông báo. public final void wait(long timeout): Chờ một khoảng thời gian cụ thể. public final void notify(): Đánh thức luồng đang chờ của đối tượng này.
public final void notifyAll(): Đánh thức tất cả các luồng đang chờ của đối tượng này. Ví dụ: wait(), notify()
1 class Customer {
2 int amount = 10000; 3
4 synchronized void withdraw(int amount) { 5 System.out.println("Rút tiền..."); 6
7 if (this.amount < amount) {
8 System.out.println("Tài khoản không đủ; đợi gửi tiền..."); 9 try { 10 wait(); 11 } catch (Exception e) { 12 } 13 } 14 this.amount -= amount; 15 System.out.println("Hoàn thành rút tiền!");
16 } 17
18 synchronized void deposit(int amount) { 19 System.out.println("Gửi tiền..."); 20 this.amount += amount;
21 System.out.println("Hoàn thành gửi tiền!"); 22 notify();
23 } 24 } 25
26 public class TestThread {
27 public static void main(String args[]) { 28 final Customer c = new Customer(); 29 new Thread() {
30 public void run() { 31 c.withdraw(15000); 32 }
33 }.start(); 34 new Thread() {
35 public void run() { 36 c.deposit(10000); 37 }
38 }.start(); 39 }
40 }
Khi có hai tiến trình trở lên cần truy xuất tới một tài nguyên chia sẻ, cần đảm bảo rằng tại một thời điểm tài nguyên đó chỉ được sử dụng bởi một thread, các thread khác phải đợi. Q trình này được gọi là đồng bộ hóa thread synchronization.
Ví dụ:
1 public class Synch {
Rút tiền...
Tài khoản khơng đủ; đợi gửi tiền... Gửi tiền...
Hồn thành gửi tiền! Hoàn thành rút tiền!
3 CallMe target = new CallMe();
4 Caller ob1 = new Caller(target, "Hello"); 5 Caller ob2 = new Caller(target, "JAVA"); 6 Caller ob3 = new Caller(target, "World"); 7 // wait for threads to end
8 try { 9 ob1.t.join(); 10 ob2.t.join(); 11 ob3.t.join(); 12 } catch (InterruptedException e) { 13 System.out.println("Interrupted"); 14 } 15 } 16 } 17 18 class CallMe { 19 void call(String msg) { 20 System.out.print("[" + msg); 21 try { 22 Thread.sleep(1000); 23 } catch (InterruptedException e) { 24 System.out.println("Interrupted"); 25 } 26 System.out.println("]"); 27 } 28 } 29
30 class Caller implements Runnable {
31 String msg; 32 CallMe target; 33 Thread t; 34
35 public Caller(CallMe targ, String s) { 36 target = targ;
37 msg = s;
38 t = new Thread(this); 39 t.start();
41
42 public void run() { 43 target.call(msg); 44 }
45 }
Hướng giải quyết
1 //Cách 1: Đồng bộ phương thức 2 class CallMe {
3 synchronized void call(String msg) { //synchronized method 4 …
5
1 //Cách 2: Đồng bộ khối lệnh
2 class Caller implements Runnable {
3 …
4 public void run() {
5 synchronized(target) { //synchronized block 6 target.call(msg);
7 } 8 } 9 }
Case Study Quản Lý Sinh Viên
Mơ phỏng q trình in mỗi bảng điểm cá nhân sleep 5 giây. Xử l đồng bộ các threads in bảng điểm. [Hello[JAVA[World] ] ] [Hello] [JAVA] [World]
Bài tập
Bài 1. Viết chương trình bộ đếm ngược. Cứ mỗi một giây sẽ in một con số giảm dần cho
đến khi hết giờ.
Bài 2. Tạo lớp PracticeThread, thực hiện in ra n số tự nhiên đầu tiên với mỗi lần in cách
nhau 1 giây. Tạo hai đối tượng t lớp PracticeThread với thứ tự ưu tiên lần lượt là 1 và 10. Quan sát và nhận xét kết quả.
Bài 3. Viết chương trình để tạo thread thứ nhất in ra lần lượt n số tự nhiên đầu tiên, và
trong khí đó thread thứ hai in ra bình phương của t ng số đó. In ra dưới dạng như sau: [1] -> (1)
[2] -> (4) [3] -> (9) [4] -> (16)
Bài 4. Dùng một chương trình ứng dụng đã có, điều chỉnh bổ sung để thêm âm thanh nền
THUẬT NGỮ VIẾT TẮT
API Application Programming Interface
CSDL Cơ sở dữ liệu
GUI Graphic User Interface
JDBC Java DataBase Connectivity
JDK Java Development Kit
JRE Java Runtime Environment
JVM Java Virtual Machine
ODBC Open Database Connectivity
RDBMS Relational Database Management Systems
TÀI LIỆU THAM KHẢO
[1] Cay Horstmann, Java concepts 7th edition, Wiley, 2014
[2] Paul Deitel, Java How to Program 9th edtion, Prentice Hall, 2012 [3] FSOFT-GST Training Material, FPT Software, 2015.
Website:
[1] https://docs.oracle.com/javase [2] http://java.sun.com