• Khi nhiều luồng cùng được thực thi, nếu có 1 luồng giữ tài nguyên mà không nhả ra sẽ làm cho các luồng khác không dùng được tài nguyên này (đói tài nguyên). Để tránh tình huống này, Ja[r]
(1)CÔNG NGHỆ JAVA
CH7 THREADS – TIẾN TRÌNH
Quang Dieu Tran PhD
(2)Nội dung
1- Luồng đa luồng 2- Luồng Java
3- Trạng thái luồng
4- Lập trình luồng Java 5- Độ ưu tiên luồng
6- Đồng luồng 7- Deadlock
(3)Luồng đa luồng
• Luồng- thread: Một dịng lệnh mà CPU phải thực thi.
• Các hệ điều hành cho phép nhiều luồng thực thi đồng thời Chúng ta quen với việc mở nhiều ứng dụng lần làm việc với máy tính Nhiều ứng dụng nạp
• Như vậy
– Một luồng chuỗi lệnh nằm nhớ ( chương trình nạp)
– application thơng thường thực thi luồng
(4)Kỹ thuật đa luồng
• Với máy có m CPU chạy m luồng Mỗi CPU chạy luồng
Hiệu
• Với máy có m CPU chạy n luồng với n>> m Mỗi CPU chạy n/m luồng
• Với CPU chạy đồng thời k luồng với k>1 Các luồng quản lý hàng đợi, luồng cấp phát thời gian mà CPU thực thi ti (cơ chế time-slicing – phân chia tài
nguyên thời gian) Luồng đỉnh hàng đợi lấy để thực thi trước, sau ti thời gian mình, luồng đưa vào cuối hàng đợi CPU lấy luồng
(5)Lợi ích đa luồng
• Tăng hiệu suất sử dụng CPU: Phần lớn thời gian thực thi ứng dụng chờ đợi nhập liệu từ user hiệu suất sử dụng CPU chưa hiệu qủa.
• Tạo đồng đối tượng: Thí dụ trò chơi, nhân vật chuyển động Trong trang Web, tạo đồng thời đường diềm (marquee) tiêu đề động (banner, chữ,ảnh chạy), vừa hiển thị đồng hồ, vừa phát nhạc, vừa chơi game, vừa hoạt ảnh
(animated images),… Trang Web thật bắt mắt (eye-catching) quyến rũ (captivating)
(6)Luồng Java
Main thread - luồng chính : luồng chứa luồng khác Đây luồng cho Java Application hành (mức toàn application).
Child thread - luồng : luồng tạo từ luồng khác.
(7)Trạng thái luồng
Sinh (Born) new Thread()
Sẵn sàng ( Ready )
Đang chạy
( Running ) Ngủ lúc
( Sleeping )
Bị tạm hỗn ( Suspended
)
Bị khóa ( Blocked )
Đã chết
Đang chờ
( Waiting )
khi chờ biến cố như xuất/nhập start()
notify()
wait() sleep() wait()
stop() hay chạy xong
Hành vi để buộc
run()
Hết thời gian ngủ
(8)Trạng thái luồng
• Một luồng sau sinh (born) không chạy mà sẵn sàng (ready) chạy Chỉ phương thức start()
được gọi luồng thực thi (chạy code phương thức run())
• Luồng thực thi bị tạm ngưng phương thức
sleep() thời khoảng lại ready sau đáo hạn thời gian Luồng ngủ không sử dụng tài nguyên CPU
• Khi nhiều luồng thực thi, có luồng giữ tài nguyên mà không nhả làm cho luồng khác khơng dùng tài ngun (đói tài ngun) Để tránh tình này, Java cung cấp chế Wait-Notify(đợi-nhận biết)
(9)Trạng thái luồng
• Khi luồng bị tạm ngưng hay bị treo, luồng rơi vào trạng thái tạm hoãn (suspended) Phương thức
suspend()- version cũ/ wait() Java 2 dùng cho mục đích này.
• Khi suspended thread mang thực thi tiếp, trạng thái luồng resumed Phương thức
resume() – version cũ/ notify() Java dùng cho mục đích này.
• Khi luồng chờ biến cố xuất/nhập liệu Luồng rơi vào trạng thái blocked.
(10)Lập trình luồng Java
• Cách 1: Xây dựng lớp lớp java.lang.Thread, override hành vi run() để phù hợp với mục đích tốn.
• Cách 2: Xây dựng lớp có thực interface Runnable
– Khơng cần import java.lang gói
– java.lang.Thread lớp Java xây dựng sẵn thực interface Runnable