Bài giảng Lập trình Java - Bài 4: Đa luồng

Các trạng thái của thread

New: Một thread ở trạng thái ‘new’

nếu bạn tạo ra một đối tượng thread

nhưng chưa gọi phương thức start().

Ready: Sau khi thead được tạo, nó sẽ

ở trạng thái sẵn sàng (ready) chờ

phương thức start()gọi nó.Các trạng thái của thread

Running: Thread ở trạng thái chạy

(đang làm việc)

Sleeping: Phương thức sleep() sẽ đưa

thead vào trạng thái ‘sleeping’ - dừng lại

tạm thời. Sau thời gian ‘sleeping’ thread

lại tiếp tục hoạt động.

pdf 50 trang kimcuc 8700
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình Java - Bài 4: Đa luồng", để 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 - Bài 4: Đa luồng

Bài giảng Lập trình Java - Bài 4: Đa luồng
LẬP TRÌNH JAVA 
BÀI 3: Đa luồng 
Nhắc lại bài trước 
 Các loại luồng dữ liệu 
 Xử lý nhập xuất bằng luồng byte 
 Truy cập file ngẫu nhiên 
 Xử lý nhập xuất bằng luồng character 
 Sử dụng try catch trong nhập/xuất 
 Chuyển đổi dữ liệu kiểu số 
2 
Nội dung bài học 
 Khái niệm multitasking và multithreading 
 Khái niệm ‘thread’ – luồng 
 Thread hiện thời 
 Các trạng thái của thread 
 Khởi tạo thread 
 Quản lý thread 
3 
Khái niệm Multitasking và Multithreading 
Multitasking: Là khả năng 
chạy đồng thời một hoặc 
nhiều chương trình cùng một 
lúc trên một hệ điều hành. 
Internet Explorer 
Microsoft Excel 
Window Media Player 
Multithreading: Là khả năng 
thực hiện đồng thời nhiều 
phần khác nhau của một 
chương trình được gọi là 
thread. 
Sheet1 
Sheet2 
Sheet3 
4 
Thread là gì? 
5 
Thread là đơn vị nhỏ nhất của mã thực thi mà đoạn mã 
đó thực hiện một nhiệm vụ cụ thể. 
Một ứng dụng có thể được chia nhỏ thành nhiều nhiệm 
vụ và mỗi nhiệm vụ có thể được giao cho một thread. 
Nhiều thread cùng thực hiện đồng thời được gọi là đa 
luồng (multithread). 
Các quá trình đang chạy dường như là đồng thời, nhưng 
thực ra nó không phải là như vậy. 
Current thread 
6 
Current thread: Là thread hiện tại đang hoạt động. 
Vòng đời của một thread 
7 
Running 
Ready 
Sleeping 
Waiting Dead 
Blocked 
New 
Các trạng thái của thread 
8 
New: Một thread ở trạng thái ‘new’ 
nếu bạn tạo ra một đối tượng thread 
nhưng chưa gọi phương thức start(). 
Ready: Sau khi thead được tạo, nó sẽ 
ở trạng thái sẵn sàng (ready) chờ 
phương thức start()gọi nó. 
Các trạng thái của thread 
9 
Running: Thread ở trạng thái chạy 
(đang làm việc) 
Sleeping: Phương thức sleep() sẽ đưa 
thead vào trạng thái ‘sleeping’ - dừng lại 
tạm thời. Sau thời gian ‘sleeping’ thread 
lại tiếp tục hoạt động. 
Các trạng thái của thread 
10 
Waiting: Khi method wait()hoạt động, thread 
sẽ rơi vào trạng trạng thái ‘waiting’-đợi. Method 
này được sử dụng khi hai hoặc nhiều thread 
cùng đồng thời hoạt động. 
Blocked: Thread sẽ rơi vào trạng thái ‘blocked’-
bị chặn khi thread đó đang đợi một sự kiện nào 
đó của nó như là sự kiện Input/Output. 
Dead: Thread rơi vào trạng thái ‘dead’-ngừng 
hoạt động sau khi thực hiện xong phương thức 
run() hoặc gọi phương thức stop(). 
11 
Hệ thống xử lý đa luồng trong Java được xây dựng 
trên class Thread và interface Runnable trong 
packaged java.lang. 
Có 2 cách để tạo một 
thread mới 
Kế thừa từ 
class Thread 
Thực thi 
interface Runable 
Khởi tạo thread 
12 
Tạo thread bằng cách sử dụng interface Runable: 
 1. Viết 1 class thực thi interface Runable và viết 
lại phương thức ‘public void run()’ 
2. Tạo ra 1 object vừa thực thi interface 
Runnable. 
3. Tạo ra 1 object của class Thread với tham số 
truyền vào là object thực thi interface Runable. 
4. Gọi phương thức start() để chạy thread 
Khởi tạo thread 
13 
 File FirstThread.java 
Khởi tạo thread 
14 
Ví dụ: SecondThread.java: 
 File SecondThread.java 
Khởi tạo thread 
15 
 File ThreadDemo.java 
Khởi tạo thread 
16 
Phương thức Ý nghĩa 
final String getName() Lấy ra tên của thread 
final int getPriority() Lấy ra thứ tự ưu tiên của thread 
final boolean isAlive() Kiểm tra 1 thread vẫn còn chạy hay không 
final void join() Chờ đến khi 1 thread ngừng hoạt động 
void run() Chạy một một thread 
static void sleep(long 
milliseconds) 
Tạm ngừng hoạt động của 1 thread với một 
khoảng thời gian là mili giây 
void start() Bắt đầu 1 thread bằng cách gọi run() 
Khởi tạo thread 
Tạo thread bằng cách sử dụng kế thừa class Thread 
17 
Khởi tạo thread 
18 
 Thực hiện 1 công việc bằng nhiều thread, cách 1 
OUTPUT 
task one 
task one 
Khởi tạo thread 
19 
 Cách 2 
OUTPUT 
task one 
task one 
task one 
Khởi tạo thread 
20 Th
ự
c 
h
iệ
n
 n
h
iề
u
 c
ô
n
g
 v
iệ
c 
b
ằn
g
 n
h
iề
u
 t
h
re
ad
Khởi tạo thread 
21 
Thực hiện nhiều công việc bằng nhiều thread 
Khởi tạo thread 
22 
Sự khác nhau giữa thực thi interface Runnable 
và kế thừa từ class Thread 
Khởi tạo thread 
23 
OUTPUT 
Implements Runnable:Counter=1 
Implements Runnable:Counter=2 
ExtendsThread: Counter=1 
ExtendsThread: Counter=1 
Sự khác nhau giữa thực thi interface Runnable 
và kế thừa từ class Thread 
Khởi tạo thread 
 Thứ tự ưu tiên giữa các tiến trình 
 Phương thức join() 
 Đồng bộ hóa thread 
 Đồng bộ hóa block 
Mối quan hệ giữa các thread 
 Hiện tượng dead lock (bế tắc) 
 Daemon thread 
 Gabage Collection thread 
 Phương thức finalize() 
24 
Quản lý thread 
Thứ tự ưu tiên thread 
• NORM_PRIORITY 5 
• MAX_PRIORITY 10 
• MIN_PRIORITY 1 
Các hằng số biểu thị độ ưu tiên 
• NORM_PRIORITY 
Giá trị mặc định cho thứ tự ưu tiên 
• final void setPriority(int p) 
• final int getPriority() 
Hai phương thức 
25 
26 
Phương thức join() 
27 
Phương thức join() 
28 
OUTPUT 
Trong run() Thread 1 
0 1 2 3 4 5 6 7 8 9 
Trong run() Thread 2 
0 1 2 3 4 5 6 7 8 9 
Phương thức join() 
Đồng bộ hóa thread 
 Đồng bộ hóa chính là việc sắp xếp thứ 
tự các luồng khi truy xuất vào cùng đối 
tượng sao cho không có sự xung đột 
dữ liệu. 
 Để đảm bảo rằng một nguồn tài 
nguyên chia sẻ được sử dụng bởi một 
thread tại một thời điểm, chúng ta sử 
dụng đồng bộ hóa (synchronization). 
 29 
Đồng bộ hóa Thread (tiếp) 
 Một ‘monitor’- là một công cụ giám sát hỗ trợ cho 
việc đồng bộ hóa các luồng. 
 Tại một thời điểm chỉ có 1 thread được vào ‘monitor’. 
 Khi một thread vào được ‘monitor’ thì tất cả các 
thread khác sẽ phải đợi đến khi thread này ra khỏi 
‘monitor’. 
 Để đưa một thread vào ‘monitor’, chúng ta phải gọi 
một phương thức có sử dụng từ khóa synchronized. 
 Sau khi thread đang chiếm giữ monitor này kết thúc 
công việc và thoát khỏi monitor thì luồng tiếp theo 
mới có thể ‘vào được’ monitor. 
30 
Đồng bộ hóa thread (tiếp) 
31 
 Không sử dụng từ khóa ‘synchronized’ 
Đồng bộ hóa thread (tiếp) 
32 
 Không sử dụng từ khóa ‘synchronized’ 
Đồng bộ hóa thread (tiếp) 
33 
 Sử dụng từ khóa ‘synchronized’ 
Đồng bộ hóa block 
34 
Đồng bộ hóa một đoạn code 
trong một phương thức của 
một đối tượng bằng cách sử 
dụng synchronized. 
Với việc đồng bộ hóa block, 
chúng ta có thể khóa chính 
xác đoạn code mình cần. 
 public void f(){ 
 synchronized(this){ 
 ... 
 } 
 } 
 public synchronized void f(){ 
 ......... 
 } 
Đồng bộ hóa method có thể được viết lại bằng đồng 
bộ hóa block như sau: 
Đồng bộ hóa block 
Mối quan hệ giữa các thead 
Java cũng cung cấp cơ chế giao 
tiếp liên-quá trình bằng cách sử 
dụng phương thức wait(), 
notify() và notifyAll(). 
36 
Các phương thức wait(), notify() and 
notifyAll() chỉ được gọi từ bên trong 
một phương thức được đồng bộ hóa 
(synchronized method). 
Phương thức wait() sẽ 
đưa thread vào trạng thái 
‘sleeping’. 
Phương thức notify() 
‘đánh thức’ thread đầu 
tiên đang ở trạng thái 
‘sleeping’ bởi vì phương 
phức wait() bị gọi. 
Phương thức notifyAll() 
‘đánh thức’ tất cả các 
thread đang ở trạng thái 
‘sleeping’ bởi vì phương 
thức wait() bị gọi. 
Khi tất cả các thread thoát 
khỏi trạng thái spleeping, 
thread có độ ưu tiên cao 
nhất sẽ chạy đầu tiên. 
37 
Mối quan hệ giữa các thead 
38 
notify() Thread 1 
notifyAll() 
Thread 1 
Thread 2 
Thread 3 
notifyAll() 
đánh thức tất cả các 
thead đang ở trạng 
thái sleeping vì vì 
phương thức wait() 
bị gọi. 
notify() đánh thức 
thread đầu tiên đang 
ở trạng thái sleeping 
vì phương thức wait() 
bị gọi. 
Mối quan hệ giữa các thead 
Mối quan hệ giữa các thead 
39 
H
o
ạt
 đ
ộ
n
g
 c
ủ
a 
w
ai
t(
) 
và
 n
o
ti
fy
()
Mối quan hệ giữa các thead 
40 
Hoạt động của wait() và notify() 
Mối quan hệ giữa các thead 
41 H
o
ạt
 đ
ộ
n
g
 c
ủ
a 
w
ai
t(
) 
và
 n
o
ti
fy
()
Mối quan hệ giữa các thead 
OUTPUT 
Ban dang rut tien... 
Khong du tien de rut ! 
Ban dang nap tien... 
Nap tien thanh cong !!! 
Ban da rut tien thanh cong !!! 
42 
Dead lock: (khóa chết hoặc bế tắc) Là tình huống xảy 
khi hai hay nhiều tiến trình chờ đợi lẫn nhau, tiến 
trình này chờ tiến trình kia kết thúc công việc thì 
mới tiếp tục được công việc của mình. Do vậy, các 
tiến trình này mãi mãi ở trạng thái chờ đợi lẫn nhau 
(waiting forever). 
Hiện tượng dead lock 
Thread 
1 
Thread 
2 
43 
Daemon threads 
Có hai loại thread trong Java: 
• Thread người dùng (user thread): Là 
thread do người dùng tạo ra. 
• Daemon threads: Là các thread làm việc 
ở chế độ nền, cung cấp các dịch vụ cho 
các thread khác. 
44 
Nếu chỉ còn các thread ‘daemon’ thì thread này 
cũng kết thúc hoạt động. 
Nếu có thì sẽ lên lịch làm việc cho thread 
tiếp theo. 
Khi 1 thread của user kết thúc hoạt động, JVM sẽ 
kiểm tra xem còn thread nào đang chạy không. 
45 
Daemon threads 
 Chúng ta có thể thiết lập 1 thread là thread 
‘daemon’ nếu chúng ta không muốn chương 
trình chính phải đợi đến khi 1 thread kết thúc. 
 Class Thread có 2 phương thức làm việc với 
thread ‘Daemon’: 
• public final void setDaemon(boolean value) 
Thiết lập 1 thread là thread ‘daemon’ 
• public final boolean isDaemon() 
Kiểm tra xem thread có phải là ‘ daemon’ không. 
 46 
Daemon threads 
Garbage Collection 
 Garbage Collection là một trong các thread 
Daemon (là luồng thu dọn các dữ liệu không 
dùng đến – dọn rác) 
 Garbage Collection sẽ tự động dọn dẹp: giải 
phóng vùng bộ nhớ không còn cần thiết nữa. 
Một object đủ điều kiện để thu gom nếu không 
có tham chiếu đến nó hoặc giá trị của nó là null. 
 Garbage Collection một thread chạy riêng biệt 
với độ ưu tiên thấp. 
47 
Phương thức finalize () 
 Là phương thức được sử dụng cho việc dọn dẹp 
các vùng tài nguyên không được dùng nữa trước 
khi hủy bỏ các đối tượng. 
 Sau khi kết thúc chương trình, trước khi trả điều 
khiển về cho hệ điều hành, phương thức 
finalize() sẽ được gọi bởi thead ‘Gabage 
collector’ để thực hiện công việc dọn dẹp. 
48 
49 
Tổng kết bài học 
 Khái niệm multitasking và multithreading 
 Khái niệm ‘thread’ – luồng 
 Thread hiện thời 
 Các trạng thái của thread 
 Khởi tạo thread 
50 
 Quản lý thread 
• Thứ tự ưu tiên giữa các tiến trình 
• Phương thức join() 
• Đồng bộ hóa thread 
• Đồng bộ hóa block 
• Mối quan hệ giữa các thread 
• Hiện tượng dead lock (bế tắc) 
• Daemon thread (luồng hiểm) 
• Gabage Collection thread 
• Phương thức finalize() 
Tổng kết bài học 

File đính kèm:

  • pdfbai_giang_lap_trinh_java_bai_4_da_luong.pdf