Bài giảng Lập trình Java - Bài 4: Đa luồng
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
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
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:
- bai_giang_lap_trinh_java_bai_4_da_luong.pdf