Lập trình java - Bài 12: Đa luồng

Lập trình java - Bài 12: Đa luồng

 Đa luồng trong lập trình java

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

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

Thread là gì?

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

Current thread: Là thread hiện tại đang hoạt động.

Current thread trong lập trình java

Vòng đời của một thread

Vòng đời của một thread trong lập trình java

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ó.

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.

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().

Khởi tạo thread

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.

Khởi tạo thread trong lập trình java

Tạo thread bằng cách sử dụng interface Runnable:

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

Tạo thread bằng cách sử dụng interface Runnable trong lập tình java

Tạo thread bằng cách sử dụng interface Runnable trong lập tình java
Tạo thread bằng cách sử dụng interface Runnable trong lập tình java

Tạo thread bằng cách sử dụng kế thừa class Thread

Tạo thread bằng cách sử dụng kế thừa class Thread trong lập trình java

Tạo thread bằng cách sử dụng kế thừa class Thread trong lập trình java

Thực hiện nhiều công việc bằng nhiều thread cách 1

Thực hiện nhiều công việc bằng nhiều thread cách 1 trong lập trình java

Thực hiện nhiều công việc bằng nhiều thread cách 2

Thực hiện nhiều công việc bằng nhiều thread cách 2 trong lập trình java

Thực hiện nhiều công việc bằng nhiều thread

Thực hiện nhiều công việc bằng nhiều thread trong lập trình java

Sự khác nhau giữa thực thi interface runnable và kế thừa từ class thread

Sự khác nhau giữa thực thi interface runnable và kế thừa từ class thread trong lập trình java

OUTPUT
Implements Runnable:Counter=1 
Implements Runnable:Counter=2 
ExtendsThread: Counter=1 
ExtendsThread: Counter=1

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
Gabage Collection thread
Phương thức finalize()

Thứ tự ưu tiên thread

Các hằng số biểu thị độ ưu tiên
NORM_PRIORITY 5
MAX_PRIORITY 10
MIN_PRIORITY 1
Giá trị mặc định cho thứ tự ưu tiên
NORM_PRIORITY
Hai phương thức
final void setPriority(int p)
final int getPriority()

Phương thức join()

Phương thức join() trong lập trình java


Phương thức join() trong lập trình java

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

Đồng bộ hóa thread trong lập trình java

Đồ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).
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.

Không sử dụng từ khóa ‘synchronized’

Không sử dụng từ khóa ‘synchronized’ trong lập trình java

Không sử dụng từ khóa ‘synchronized’ trong lập trình java

Sử dụng từ khóa ‘synchronized’

Sử dụng từ khóa ‘synchronized’ trong lập trình java


Đồng bộ hóa block

Đồ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.

Đồng bộ hóa method có thể được viết lại bằng đồng bộ hóa block như sau:

public void f(){
synchronized(this){
...
}
}
public synchronized void f(){
.........
}

Mối quan hệ giữa các thread

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()notifyAll().
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’.
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.
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.

Mối quan hệ giữa các thread trong lập trình java

Hoạt động của wait() và notify()

Hoạt động của wait() và notify() trong lập trình java

Hoạt động của wait() và notify() trong lập trình java

Hoạt động của wait() và notify() trong lập trình java

OUTPUT
Ban dang rut tien... Khong du tien de rut ! Ban dang nap tien...
Nap tien thanh cong !!!
Ban da rut tien thanh cong !!!

Hiện tượng dead lock

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 trong lập trình java


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.
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.
Nếu có thì sẽ lên lịch làm việc cho thread tiếp theo.
Nếu chỉ còn các thread ‘daemon’ thì thread này cũng kết thúc hoạt động.
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.

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.

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.

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
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()


ĐĂNG NHẬN XÉT

Previous Post Next Post