Multithreading (đa tuyến) trong Java(phần 1)

23 374 6
Multithreading (đa tuyến) trong Java(phần 1)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Multithreading (đa tuyến) trong Java(phần 1)

Multithreading (đa tuyến) Java(phần 1) Multithreading cho phép hai phần chương trình chạy đồng thời Article thảo luận cách làm để thực điều tốt Java Đây phần trích từ chương 10 sách Java Dymistyfied, viết Jim Keogh Các vận động viên marathon thường đối mặt với tình trạng khó khăn hai đua rơi vào tuần họ phải chọn đua để chạy Họ chắn phải mong ước có cách, phần họ chạy đua phần khác chạy đua khác Điều khơng thể xảy – ngoại trừ, vận động viên chương trình Java, hai phần chương trình Java chạy đồng thời việc sử dụng multithreading Bạn học multithreading cách làm để chạy đồng thời phần chương trình bạn chương Multitasking (đa nhiệm) Multitasking thực thi hai hay nhiều tác nhiệm lúc Gần tất hệ điều hành có khả multitasking việc sử dụng hai kỹ thuật multitasking: multitasking dựa process (xử lý) multitasking dựa thread (phân tuyến) Multitasking dựa process chạy hai chương trình lúc Các lập trình viên nói đến chương trình process Vì bạn nói rằng, multitasking dựa process multitasking dựa chương trình Multitasking dựa thread có chương trình thực hai tác nhiệm thời điểm Ví dụ, chương trình xử lý văn kiểm tra lỗi tả tài liệu bạn viết tài liệu Đó multitasking dựa thread Cách tốt để nhớ khác multitasking dựa process multitasking dựa thread nghĩ dựa process làm việc với nhiều chương trình dựa thread làm việc với nhiều phần chương trình Mục tiêu multitasking sử dụng thời gian nghỉ CPU Tưởng tượng CPU động xe bạn Động xe bạn chạy cho dù xe có di chuyển hay khơng Bạn muốn xe di chuyển nhiều đến mức có thể, để bạn chạy nhiều dặm từ gallon ga Một động để khơng lãng phí ga Cùng khái niệm áp dụng cho CPU máy tính bạn Bạn muốn CPU bạn xoay vòng để xử lý lệnh liệu chờ điều để xử lý Một CPU xoay vịng tương tự với vận hành động bạn Có thể khó khăn để tin tưởng, CPU nghỉ nhiều xử lý nhiều máy tính để bàn Hãy nói rằng, bạn sử dụng trình xử lý văn để viết tài liệu Trong hầu hết phần việc, CPU khơng làm bạn nhập ký tự từ bàn phím di chuyển chuột Multitasking thiết kế để sử dụng phần nhỏ giây để xử lý lệnh từ chương trình khác từ phần khác chương trình Tạo nên sử dụng CPU cách có hiệu khơng phải định chương trình chạy máy tính để bàn hầu hết chạy chương trình đồng thời chạy nhiều phần chương trình vào thời điểm Tuy nhiên, chương trình chạy môi trường mạng, cần trao đổi xử lý từ nhiều máy tính, cần phải tạo thời gian nghỉ hiệu CPU Multithreading Java – Overhead Hệ điều hành phải làm công việc phụ để quản lý multitasking, lập trình viên gọi cơng việc phụ overhead tài nguyên máy tính bạn sử dụng để quản lý hoạt động multitasking nhiều sử dụng chương trình để xử lý lệnh liệu Multitasking dựa process có overhead lớn multitasking dựa thread Trong multitasking dựa process, process yêu cầu không gian địa vùng nhớ Hệ điều hành u cầu lượng thời gian CPU xác định để chuyển từ xử lý sang xử lý khác Các lập trình viên gọi context switching, process (hay chương trình) context Các tài nguyên bổ sung cần cho process để giao tiếp với process khác Trong so sánh này, thread multitasking dựa thread chia sẻ không gian địa vùng nhớ chúng chia sẻ chương trình Ở có tác động context switching, chuyển đổi từ phần chương trình sang phần khác xảy không gian địa vùng nhớ Ngược lại, việc giao tiếp phần chương trình xảy vị trí vùng nhớ Thread Một thread phần chương trình chạy Multitasking dựa thread có nhiều thread chạy thời điểm (nhiều phần chương trình chạy lúc) Mỗi thread cách thực thi khác Hãy trở ví dụ trình xử lý văn để xem thread sử dụng Hai phần trình xử lý văn quan tâm: phần nhận ký tự nhập từ bàn phím, lưu chúng vào nhớ, hiển thị chúng hình Phần thứ hai phần cịn lại chương trình nhằm kiểm tra tả Mỗi phần thread thực thi độc lập với phần khác Thậm chí dù chúng chương trình Trong thread nhận xử lý ký tự nhập từ bàn phím, thread khác ngủ Đó là, thread khác dừng CPU nghỉ CPU thường nghỉ lần gõ phím Vào khoảng thời gian này, thread kiểm tra tả ngủ thức dậy tiếp tục kiểm tra tả tài liệu Thread kiểm tra tả dừng lần ký tự nhập từ bàn phím Mơi trường runtime Java quản lý thread không giống multitasking dựa process mà hệ điều hành quản lý việc chuyển đổi chương trình Các thread xử lý đồng Điều có nghĩa thread dừng thread tiếp tục xử lý Một thread bốn trạng thái sau:  Running: thread thực thi  Suspended: việc thực thi bị tạm dừng phục hồi thời điểm dừng  Blocked: tài nguyên truy cập sử dụng thread khác  Terminated: việc thực thi bị ngừng hẳn phục hồi Tất thread không giống Một vài thread quan trọng thread khác cho quyền ưu tiên cao tài nguyên CPU Mỗi thread gán quyền ưu tiên thread sử dụng để xác định chuyển từ thread thực thi sang thread khác Được gọi context switching Quyền ưu tiên thread có quan hệ với quyền ưu tiên thread khác Quyền ưu tiên thread khơng thích hợp có thread chạy Thread có quyền ưu tiên thấp chạy nhanh thread có quyền ưu tiên cao khơng có thread khác chạy lúc Các quyền ưu tiên thread sử dụng quy luật context switching sử dụng Dưới quy luật này:  Một thread tự động sản sinh thread khác Để làm điều này, điều khiển trả cho thread có quyền ưu tiên cao  Một thread có quyền ưu tiên cao giành quyền sử dụng CPU từ thread có quyền ưu tiên thấp Thread có quyền ưu tiên thấp bị tạm dừng bất chấp làm để trả theo cách thread có quyền ưu tiên cao Các lập trình viên gọi preemptive multitasking  Các thread có quyền ưu tiên xử lý dựa quy luật hệ điều hành sử dụng để chạy chương trình Ví dụ, Windows sử dụng time slicing, bao gồm việc cho thread có quyền ưu tiên cao vài mili giây vòng CPU giữ việc xoay vịng thread có quyền ưu tiên cao Trong Solaris, thread có quyền ưu tiên cao phải tự động sản sinh thread có quyền ưu tiên cao khác Nếu khơng, thread có quyền ưu tiên cao thứ nhì phải chờ thread có quyền ưu tiên cao kết thúc Sự đồng hoá Multithreading xảy khơng đồng bộ, có nghĩa thread thực thi độc lập với thread khác Theo đó, thread khơng phụ thuộc vào thực thi thread khác Để bắt buộc, xử lý chạy đồng hóa phụ thuộc vào xử lý khác Đó xử lý chờ xử lý khác kết thúc trước thực thi Thỉnh thoảng, việc thực thi thread phụ thuộc vào việc thực thi thread khác Giả sử bạn có hai thread – tập hợp thông tin đăng nhập khác kiểm tra mật ID người dùng Thread login phải chờ thread validation hoàn tất xử lý trước nói cho người dùng việc đăng nhập có thành cơng hay khơng Vì hai thread phải thực thi đồng bộ, không không đồng Java cho phép thread đồng hóa định nghĩa method đồng hố Một thread nằm method đồng hóa ngăn thread khác từ phương thức đồng hoá khác gọi đối tượng Bạn học chúng phần sau chương Interface (giao tiếp) Runnable lớp Thread Bạn khởi dựng thread việc sử dụng interface Runnable class Thread Điều có nghĩa thread bạn phải kế thừa từ class Thread bổ sung interface Runnable Class Thread định nghĩa bên method bạn sử dụng để quản lý thread Dưới method thông dụng định nghĩa class Thread Method Mô tả getName() Trả tên thread getPriority() Trả quyền ưu tiên thread isAlive() Xác định thread chạy join() Tạm dừng thread kết thúc run() Danh mục cần thực bên thread sleep() Suspends thread Method cho phép bạn xác định khoảng thời gian mà thread cho tạm dừng start() Bắt đầu thread Main thread Mỗi chương trình Java có thread, chí bạn khơng tạo thread Thread gọi main thread thread thực thi bạn bắt đầu chương trình bạn Main thread sinh thread mà bạn tạo Những thread gọi child thread Main thread luôn thread cuối kết thúc việc thực thi thơng thường main thread cần giải phóng tài nguyên sử dụng chương trình chẳng hạn kết nối mạng Các lập trình viên điều khiển main thread cách tạo đối tượng thread sau sử dụng method đối tượng thread để điều khiển main thread Bạn tạo đối tượng thread cách gọi method currentThread() Method currentThread() trả reference (tham chiếu) đến thread, sau bạn sử dụng reference để điều khiển main thread thread khác Để tạo reference đến main thread đổi tên thread từ main thành Demo Thread Chương trình làm để làm điều Màn hình hiển thị chương trình chạy Current thread: Thread[main, 5,main] Renamed Thread: Thread[Demo Thread, 5,main] Đoạn mã thể điều class Demo { public static void main (String args[] ) { Thread t = Thread.currentThread(); System.out.println("Current thread: " + t); t.setName("Demo Thread"); System.out.println("Renamed Thread: " + t); } } Như bạn học chương này, thread tự động tạo bạn thực thi chương trình Mục đích ví dụ cơng bố reference đến thread gán cho main thread Điều thực dòng method main() Chúng ta công bố reference việc xác định tên lớp tên cho reference Điều thực nhờ dòng mã Thread t = Thread.currentThread() Chúng ta có reference đến main thread việc gọi method currentThread() class Thread Reference trả method currentThread() sau gán cho reference cơng bố trước phần mở đầu phát biểu Thread[main, 5,main] Thông tin bên cặp ngoặc vng nói cho biết vài thơng tin thread Từ main xuất tên thread Số quyền ưu tiên thread, quyền ưu tiên thông thường Quyền ưu tiên nằm phạm vi từ đến 10, thấp 10 cao Từ main nằm cuối tên nhóm thread mà thread thuộc Một nhóm thead cấu trúc liệu sử dụng để điều khiển trạng thái tập hợp thread Bạn không cần quan tâm đến nhóm thread mơi trường Java run-time xử lý điều Method setName() gọi làm để bạn điều khiển main thread chương trình bạn.Method setName() method thành viên class Thread sử dụng để thay đổi tên thread Ví dụ sử dụng setName() để thay đổi tên main thread từ main thành Demo Thread Thread hiển thị lần hình với tên thay đổi Tạo thread riêng bạn Nhớ chương trình bạn main thread, phần khác chương trình bạn thread Bạn thiết kế phần chương trình bạn thread việc tạo thread riêng bạn Cách dễ dàng để làm điều bổ sung interface Runnable Việc bổ sung interface Runnable lựa chọn để lớp bạn kế thừa class Thread Một interface mô tả hay nhiều method thành viên mà bạn phải định nghĩa class bạn theo quy định tuân theo interface Những method mô tả với tên method, danh sách đối số giá trị trả Interface Runnable mô tả method lớp cần tạo tương tác với thread Theo quy định, để sử dụng interface class bạn, bạn phải định nghĩa method mô tả interface Runnable Khá thuận lợi, bạn cần định nghĩa method mô tả interface Runnable – method run() Method run() phải method public, không yêu cầu danh sách đối số giá trị trả Nội dung method run() phần chương trình bạn trở thành thread Các phát biểu bên method run() thuộc main thread Các phát biểu bên method run() thuộc thread Cả main thread thread chạy lúc bạn bắt đầu thread Bạn học điều ví dụ Thread kết thúc method run() kết thúc Điều khiển sau trả cho phát biểu gọi method run() Khi bạn bổ sung interface Runnable, bạn cần gọi khởi dựng class Thread Khởi dựng yêu cầu hai đối số Đối số thực thể lớp để bổ sung interface Runnable nói cho khởi dựng biết thread thực thi từ đâu Đối số thứ hai tên thread Đây định dạng khởi dựng Thread(Runnable class, String name) Khởi dựng tạo thread khơng bắt đầu thread Bạn bắt đầu thread cách gọi method start() Method start() gọi method run() bạn định nghĩa chương trình bạn Method start() khơng có danh sách đối số khơng có giá trị trả Ví dụ làm để tạo bắt đầu thread Đây hiển thị chương trình chạy Main thread started Child thread started Child thread terminated Main thread terminated class MyThread implements Runnable { Thread t; MyThread() { t = new Thread(this,"My thread"); t.start(); } public void run() { System.out.println("Child thread started"); System.out.println("Child thread terminated"); } } class Demo { public static void main(String args[]) { new MyThread(); System.out.println("Main thread started"); System.out.println("Main thread terminated"); } } Ví dụ bắt đầu việc định nghĩa class gọi MyThread, bổ sung interface Runnable Vì sử dụng từ khóa implements để bổ sung interface Runnable Kế tiếp, reference đến thread công bố Tiếp định nghĩa khởi dựng cho class Khởi dựng gọi khởi dựng class Thread Bởi bổ sung interface Runnable, cần đặt khởi dựng reference đến thực thể class thực thi thread tên thread Chú ý rằng, từ khóa this reference đến thực thể hành class Khởi dựng trả reference cho thread mới, gán cho reference công bố phát biểu class MyThread Chúng ta sử dụng reference để gọi method start() Nhớ method start() gọi method run() Kế đến định nghĩa method run() Những phát biểu bên method run() trở thành phần chương trình thực thi thread thực thi Chỉ có hai phát biểu thể method run() Kế tiếp, định nghĩa class chương trình Class chương trình thực thi thread việc gọi thực thể class MyThread Thực điều cách gọi toán tử new khởi dựng class MyThread Cuối chương trình kết thúc việc hiển thị hai dịng hình Multithreading Java(phần 2) Phần tiếp tục trình bày cách tạo thread việc sử dụng từ khóa extends cách tạo quyền ưu tiên cho thread Tạo Thread sử dụng extends Bạn kế thừa class Thread cách khác để tạo thread chương trình bạn Bằng việc sử dụng từ khóa extends định nghĩa class để kế thừa class khác, bạn công bố thực thể class bạn truy cập đến thành viên class Thread Bất class bạn kế thừa class Thread, bạn phải override (cài chồng) method run(), phần thread Ví dụ làm để kế thừa class Thread override method run() Ví dụ định nghĩa class MyThread kế thừa class Thread Khởi dựng class MyThread gọi khởi dựng class Thread việc sử dụng từ khóa super đặt vào tên thread mới, MyThread Sau gọi method start() để kích hoạt thread Method start() gọi method run() class MyThread Bạn ý ví dụ này, method run() override việc hiển thị hai dòng hình child thread bắt đầu kết thúc Nhớ phát biểu bên method run() tạo nên phần chương trình chạy thread Vì chương trình bạn có nhiều phát biểu method run() ví dụ Thread công bố bên method main() class Demo, class chương trình ứng dụng Sau thread bắt đầu, hai thông điệp hiển thị trạng thái main thread class MyThread extends Thread { MyThread(){ super("My thread"); start(); } public void run() { System.out.println("Child thread started"); System.out.println("Child thread terminated"); } } class Demo { public static void main (String args[]){ new MyThread(); System.out.println("Main thread started"); System.out.println("Main thread terminated"); } } Chú ý rằng, bạn nên bổ sung interface Runnable có method run() method class Thread mà bạn cần override Bạn nên kế thừa class Thread bạn cần override method khác định nghĩa class Thread Sử dụng nhiều thread chương trình Không phải không thường cần phải chạy nhiều thực thể thread, chẳng hạn chương trình bạn in nhiều tài liệu lúc Các lập trình viên gọi spawning thread Bạn sinh số lượng thread mà bạn cần class riêng bạn định nghĩa có bổ sung interface Runnable kế thừa class Thread sau cơng bố thực thể class Mỗi thực thể thread Hãy xem điều thực Ví dụ định nghĩa class gọi MyThread bổ sung interface Runnable Khởi dựng MyThread chấp nhận đối số, chuỗi sử dụng tên thread Chúng ta tạo thread bên khởi dựng cách gọi khởi dựng class Thread truyền vào reference đến đối tượng định nghĩa thread tên thread Nhớ rằng, từ khóa this reference đến đối tượng Method start() sau gọi gọi method run() Method run() override class MyThread Có hai điều xảy method run() thực thi Đầu tiên tên method hiển thị hình Thứ hai, thread tạm dừng giây method sleep() gọi Method sleep() định nghĩa class Thread chấp nhận hai tham số Tham số số mili giây mà thread tạm dừng Tham số thứ hai số micro giây mà thread tạm dừng Trong ví dụ này, quan tâm đến mili giây khơng cần tham số thứ hai (2000 nano giây giây) Sau thread tạm dừng, phát biểu khác hiển thị hình bắt đầu thread kết thúc Method main() class Demo công bố bốn thực thể thread việc gọi khởi dựng class MyThread truyền vào tên thread Mỗi thread coi thread nhỏ Main thread sau tạm dừng 10 giây việc gọi method sleep() Trong suốt thời gian này, thread tiếp tục thực thi Khi main thread quay lại, hiển thị thông điệp main thread kết thúc Đây hình hiển thị ví dụ chạy Thread: Thread: Thread: Thread: Terminating thread: Terminating thread: Terminating thread: Terminating thread: Terminating thread: main thread Mã nguồn ví dụ: class MyThread implements Runnable { String tName; Thread t; MyThread (String threadName) { tName = threadName; t = new Thread (this, tName); t.start(); } public void run() { try { System.out.println("Thread: " + tName ); Thread.sleep(2000); } catch (InterruptedException e ) { System.out.println("Exception: Thread " + tName + " interrupted"); } System.out.println("Terminating thread: " + tName ); } } class Demo { public static void main (String args []) { new MyThread ("1"); new MyThread ("2"); new MyThread ("3"); new MyThread ("4"); try { Thread.sleep (10000); } catch (InterruptedException e) { System.out.println("Exception: Thread main interrupted."); } System.out.println("Terminating thread: main thread."); } } Sử dụng isAlive() join() Thông thường, main thread thread cuối kết thúc chương trình Tuy nhiên, khơng phải bảo đảm khơng có trường hợp, main thread kết thúc trước child thread kết thúc Trong ví dụ trước, chúng tơi nói method main ngủ child thread kết thúc Tuy nhiên ước lượng khoảng thời gian thực để child thread hoàn tất xử lý Nếu khoảng thời gian ước lượng ngắn, child thread kết thúc sau main thread kết thúc Vì thế, kỹ thuật sleep cách tốt để bảo đảm main thread kết thúc cuối Các lập trình viên sử dụng hai cách khác để xác định main thread thread cuối kết thúc Những kỹ thuật bao gồm việc gọi method isAlive() method join() Cả hai method định nghĩa class Thread Method isAlive() xác định method chạy hay khơng Nếu cịn, isAlive() trả giá trị Boolean true Ngược lại, Boolean false trả Bạn sử dụng method isAlive() để xác định child method tiếp tục chạy hay không Method join() chờ child thread kết thúc “kết nối” main thread Ngồi ra, bạn sử dụng method join() để xác định lượng thời gian mà bạn muốn chờ child thread kết thúc Ví dụ sử dụng method isAlive() method join() chương trình bạn Ví dụ gần giống ví dụ trước Sự khác biết nằm method main() class Demo Sau thread công bố sử dụng khởi dựng class MyThread Method isAlive() gọi cho thread Giá trị trả method isAlive() hiển thị hình Kế tiếp method join() gọi cho thread Method join() làm cho main thread chờ tất child thread hoàn tất xử lý trước main thread kết thúc Đây hiển thị hình chương trình chạy Thread Status: Alive Thread 1: true Thread 2: true Thread 3: true Thread 4: true Threads Joining Thread: Thread: Thread: Thread: Terminating thread: Terminating thread: Terminating thread: Terminating thread: Thread Status: Alive Thread 1: false Thread 2: false Thread 3: false Thread 4: false Terminating thread: main thread Mã nguồn class MyThread implements Runnable { String tName; Thread t; MyThread (String threadName) { tName = threadName; t = new Thread (this, tName); t.start(); } public void run() { try { System.out.println("Thread: " + tName ); Thread.sleep(2000); } catch (InterruptedException e ) { System.out.println("Exception: Thread " + tName + " interrupted"); } System.out.println("Terminating thread: " + tName ); } } class Demo { public static void main (String args []) { MyThread thread1 = new MyThread ("1"); MyThread thread2 = new MyThread ("2"); MyThread thread3 = new MyThread ("3"); MyThread thread4 = new MyThread ("4"); System.out.println("Thread Status: Alive"); System.out.println("Thread 1: " + thread1.t.isAlive()); System.out.println("Thread 2: " + thread2.t.isAlive()); System.out.println("Thread 3: " + thread3.t.isAlive()); System.out.println("Thread 4: " + thread4.t.isAlive()); try { System.out.println("Threads Joining."); thread1.t.join(); thread2.t.join(); thread3.t.join(); thread4.t.join(); } catch (InterruptedException e) { System.out.println("Exception: Thread main interrupted."); } System.out.println("Thread Status: Alive"); System.out.println("Thread 1: " + thread1.t.isAlive()); System.out.println("Thread 2: " + thread2.t.isAlive()); System.out.println("Thread 3: " + thread3.t.isAlive()); System.out.println("Thread 4: " + thread4.t.isAlive()); System.out.println("Terminating thread: main thread."); } } Cài đặt quyền ưu tiên Thread Trong phần trước, bạn học thread có quyền ưu tiên gán sử dụng thread quan trọng sử dụng tài nguyên Quyền ưu tiên sử dụng hướng dẫn cho hệ điều hành xác định thread truy cập đến tài nguyên chẳng hạn CPU Trong thực tế, hệ điều hành đặt trình quản lý vào quản lý Thơng thường lập trình viên có khơng có quyền điều khiển trình quản lý khác Vì thế, chúng thành lập quyền ưu tiên cho thread chúng mà không quan tâm xa đến trình quản lý khác Một quyền ưu tiên số nguyên xác từ đến 10, 10 quyền ưu tiên cao xem quyền ưu tiên tối đa, quyền ưu tiên thấp xem quyền ưu tiên tối thiểu Quyền ưu tiên thông thường 5, quyền ưu tiên mặc định cho thread Nói chung, thread có quyền ưu tiên cao giành việc sử dụng tài nguyên thread có quyền ưu tiên thấp Thread có quyền ưu tiên thấp tạm dừng thread có quyền ưu tiên cao kết thúc việc sử dụng tài nguyên Bất kỳ nào, có hai thread có quyền ưu tiên cần tài nguyên thời điểm, thread truy cập tài nguyên giành quyền sử dụng tài nguyên Những xảy cho thread thứ hai phụ thuộc vào hệ điều hành mà bạn chạy chương trình Một số hệ điều hành bắt thread thứ hai chờ thread thứ kết thúc sử dụng tài nguyên Hệ điều hành khác yêu cầu thread để thread thứ hai truy cập tài nguyên sau khoảng thời gian xác định Điều để chắn thread không chiếm dụng tài nguyên ngăn thread khác sử dụng Trong giới thực, thread thường tạm dừng sử dụng tài nguyên tài ngun khác cần khơng có sẵn Trong suốt thời gian tạm dừng đó, hệ điều hành để thread giải phóng tài nguyên Vấn đề bạn thời gian tạm dừng xảy Do tốt ln ln để thread tạm dừng sau khoảng thời gian thread sử dụng tài nguyên suốt khoảng thời gian dài Theo cách này, thread chia sẻ tài nguyên với thread khác Bạn cần nhớ có mặt tiêu cực tạm dừng thread khoảng thời gian cách tự động Việc dừng thread làm giảm khả thực thi chương trình bạn gây lỗi backlog việc sử dụng tài nguyên Do bạn cần quan sát việc thực thi chương trình bạn cách đặn để chắn bạn chịu đựng ảnh hưởng tiêu cực việc dừng thread Bây giờ, tập trung vào bạn làm để điều khiển – ấn định quyền ưu tiên thread Bạn ấn định quyền ưu tiên thread cách gọi method setPriority(), định nghĩa class Thread Method setPriority() yêu cầu tham số, số nguyên thay cho mức độ quyền ưu tiên Bạn có hai cách để thay quyền ưu tiên Bạn sử dụng số nguyên từ đến 10, bạn sử dụng biến final định nghĩa class Thread Các biến MAX_PRIORITY, MIN_PRIORITY NORM_PRIORITY Bạn xác định mức độ ưu tiên thread method getPriority(), định nghĩa class Thread Method getPriority() không yêu cầu tham số nào, trả số nguyên thay cho mức độ quyền ưu tiên thread Ví dụ làm để sử dụng method setPriority() method getPriority() Ví dụ tạo hai child thread ấn định quyền ưu tiên cho thread Đầu tiên thread có quyền ưu tiên thấp bắt đầu, sau thread có quyền ưu tiên cao Dưới hiển thị chạy chương trình (chú ý thread có quyền ưu tiên cao chạy trước thread có quyền ưu tiên thấp thread có quyền ưu tiên thấp bắt đầu trước low priority started high priority started high priority running low priority running low priority stopped high priority stopped Mã nguồn class MyThread implements Runnable { Thread t; private volatile boolean running = true; public MyThread (int p, String tName) { t = new Thread(this,tName); t.setPriority (p); } public void run() { System.out.println(t.getName() + " running."); } public void stop() { running = false; System.out.println(t.getName() + " stopped."); } public void start() { System.out.println(t.getName() + " started"); t.start(); } } class Demo { public static void main(String args[] ) { Thread.currentThread().setPriority(10); MyThread lowPriority = new MyThread (3, "low priority"); MyThread highPriority = new MyThread (7, "high priority"); lowPriority.start(); highPriority.start(); try { Thread sleep(1000); } catch ( InterruptedException e) { System.out.println("Main thread interrupted."); } lowPriority.stop(); highPriority.stop(); try { highPriority.t.join(); lowPriority.t.join(); } catch (InterruptedException e) { System.out.println("InterruptedException caught"); } } } Multithreading (đa tuyến) Java(phần 3) Ảnh hưởng quan trọng hai hay nhiều thread chia sẻ tài nguyên có số chúng truy cập vào tài nguyên thời điểm Các lập trình viên xác định việc việc đồng hoá thread Đồng hoá Thread Ảnh hưởng quan trọng hai hay nhiều thread chia sẻ tài nguyên có số chúng truy cập vào tài nguyên thời điểm Các lập trình viên xác định việc việc đồng hoá thread Các thread đồng hoá Java sử dụng thông qua monitor Hãy nghĩ rằng, monitor object cho phép thread truy cập vào tài nguyên Chỉ có thread sử dụng monitor vào khoảng thời gian Các lập trình viên nói rằng, thread sở hữu monitor vào thời gian Monitor gọi semaphore Một thread sở hữu monitor thread khác không sở hữu monitor Nếu monitor có sẵn, thread sở hữu monitor truy cập thẳng đến tài nguyên tập hợp với monitor Nếu monitor khơng có sẳn, thread bị suspend monitor trở thành có sẵn Các lập trình viên nói thread chờ monitor Cuối cùng, tác nhiệm việc yêu cầu monitor xảy đằng sau “màn chắn” Java Java xử lý tất chi tiết cho bạn Bạn phải đồng hố thread chương trình bạn có nhiều thread sử dụng tài nguyên Bạn có hai cách để đồng hoá thread: bạn sử dụng method đồng hóa statement đồng hóa Sử dụng method đồng hóa Tất object Java có monitor Một thread có monitor method bổ sung từ khóa synchronized gọi Thread lần gọi method đồng hóa nói nằm bên method sở hữu method tài nguyên sử dụng method Các thread khác gọi method đồng hố chờ thread giải phóng method đồng hóa Nếu method đồng hố instance method, method đồng hóa kích hoạt khóa kèm với instance gọi method đồng hóa object biết this suốt q trình thực thi tồn method Nếu method đồng hóa static kích hoạt khóa kèm với class định nghĩa method đồng hoá Trước bạn học cách làm để định nghĩa method đồng hóa chương trình bạn, xem xảy việc đồng hố khơng sử dụng chương trình Đây mục đích ví dụ đây, chương trình hiển thị hai tên bên dấu ngoặc đơn sử dụng hai thread Đây tiến trình ba bước, bao gồm mở ngoặc đơn, tên đóng ngoặc đơn hiển thị bước Ví dụ định nghĩa ba lớp, class Parentheses, class MyThread class Demo class chương trình Class Parentheses định nghĩa method display(), nhận vào chuỗi danh sách đối số hiển thị chuỗi ngoặc đơn hình Class MyThread định nghĩa thread Trong làm điều này, khởi dựng MyThread yêu cầu hai đối số Đối số reference đến instance class Parentheses Đối số thứ hai chuỗi chứa tên hiển thị hình Method run() sử dụng instance class Parentheses để gọi method display nó, truyền vào cho method display() tên để xuất hình Phần cịn lại hoạt động method main() class Demo Phát biểu công bố instance class Parentheses Hai dòng tạo hai thread Chú ý hai thread sử dụng instance class Parentheses Đây hiển thị bạn chạy chương trình Có thể không bạn mong đợi Mỗi tên nên bao cặp ngoặc đơn chúng Vấn đề method display() khơng đồng hố (Bob(Mary) ) class Parentheses { void display(String s) { System.out.print ("(" + s); try { Thread.sleep (1000); } catch (InterruptedException e) { System.out.println ("Interrupted"); } System.out.println(")"); } } class MyThread implements Runnable { String s1; Parentheses p1; Thread t; public MyThread (Parentheses p2, String s2) { p1= p2; s1= s2; t = new Thread(this); t.start(); } public void run() { p1.display(s1); } } class Demo{ public static void main (String args[]) { Parentheses p3 = new Parentheses(); MyThread name1 = new MyThread(p3, "Bob"); MyThread name2 = new MyThread(p3, "Mary"); try { name1.t.join(); name2.t.join(); } catch (InterruptedException e ) { System.out.println( "Interrupted"); } } } Vấn đề ví dụ thread chia tài nguyên lúc Tài nguyên method display() định nghĩa class Parentheses Theo quy định để thread đặt điều khiển method display() phải đồng hóa method display() Điều thực cách sử dụng từ khóa synchronized đặt đầu method display() Đây bạn muốn thấy ví dụ trước (Bob) (Mary) class Parentheses { synchronized void display(String s) { System.out.print ("(" + s); try { Thread.sleep (1000); } catch (InterruptedException e) { System.out.println ("Interrupted"); } System.out.println(")"); } } class MyThread implements Runnable { String s1; Parentheses p1; Thread t; public MyThread (Parentheses p2, String s2) { p1= p2; s1= s2; t = new Thread(this); t.start(); } public void run() { p1.display(s1); } } class Demo{ public static void main (String args[]) { Parentheses p3 = new Parentheses(); MyThread name1 = new MyThread(p3, "Bob"); MyThread name2 = new MyThread(p3, "Mary"); try { name1.t.join(); name2.t.join(); } catch (InterruptedException e ) { System.out.println( "Interrupted"); } } } Multithreading Java(phần 4) Việc đồng hóa method cách tốt để hạn chế việc sử dụng method thời điểm Tuy nhiên có trường hợp mà bạn khơng thể đồng hóa method, chẳng hạn bạn sử dụng class cung cấp bên thứ ba Trong trường hợp thế, bạn không phép truy cập vào định nghĩa lớp, ngăn bạn sử dụng từ khóa synchronized Sử dụng phát biểu đồng hố Một cách khác để sử dụng từ khóa synchronized sử dụng phát biểu đồng hóa Một phát biểu đồng hóa chứa block đồng hóa , mà bên đặt đối tượng method đồng hóa Gọi method chứa block đồng hóa xảy thread có monitor đối tượng Mặc dù bạn gọi method bên block đồng hóa, việc cơng bố method phải thực bên block đồng hóa Ví dụ cách làm để sử dụng phát biểu đồng hóa Ví dụ giống ví dụ trước, nhiên phát biểu đồng hóa sử dụng thay từ khóa synchronized Phát biểu đặt method run() class MyThread Phát biểu đồng hóa đồng hóa instance class Parentheses ngăn hai thread sử dụng method display() lúc class Parentheses { void display(String s) { System.out.print ("(" + s); try { Thread.sleep (1000); } catch (InterruptedException e) { System.out.println ("Interrupted"); } System.out.println(")"); } } class MyThread implements Runnable { String s1; Parentheses p1; Thread t; public MyThread (Parentheses p2, String s2) { p1= p2; s1= s2; t = new Thread(this); t.start(); } public void run() { synchronized(p1){ p1.display(s1); } } } class Demo{ public static void main (String args[]) { Parentheses p3 = new Parentheses(); MyThread name1 = new MyThread(p3, "Bob"); MyThread name2 = new MyThread(p3, "Mary"); try { name1.t.join(); name2.t.join(); } catch (InterruptedException e ) { System.out.println( "Interrupted"); } } } Ở đây, method display() khơng sử dụng từ khóa synchronized Thay vào đó, phát biểu đồng hóa sử dụng bên method run() Điều cho kết giống với ví dụ trước thread chờ khoảng thời gian để thread lại kết thúc trước tiếp tục xử lý Giao tiếp thread Các thread mở cho lập trình viên khoảng khơng lập trình, nơi mà phần chương trình thực thi khơng đồng với nhau, xử lý độc lập với xử lý khác Tuy nhiên thread cần tính tốn việc xử lý chúng cần giao tiếp với thread khác suốt trình xử lý Các lập trình viên gọi inter-process communication (giao tiếp xử lý) Bạn có thread giao tiếp với thread khác chương trình bạn cách sử dụng method wait(), notify() notifyAll() Những method gọi từ bên method đồng hóa Method wait() nói cho thread giải phóng monitor vào trạng thái suspend Có hai dạng method wait() khác Một dạng không yêu cầu đối số thread chờ thơng báo Một dạng khác có đối số để bạn xác định khoảng thời gian chờ Bạn xác định độ dài thời gian mili giây đặt vào method wait() Method notify() nói cho thread suspend method wait() lấy lại điều khiển monitor Method notifyAll() đánh thức tất thread chờ điều khiển monitor Những thread khác chờ trạng thái suspend monitor có sẵn trở lại Ví dụ cho bạn làm để sử dụng method ứng dụng Mục đích chương trình có class Pulishser cho giá trị cho class Consumer thơng qua sử dụng class Queue Ví dụ định nghĩa bốn class, class Pulisher, class Comsumer, class Queue class Demo Class Queue định nghĩa hai instance: exchangeValue biến cờ exchangeValue đặt vào giá trị queue publisher Biến cờ sử dụng cách đánh dấu giá trị đặt vào queue Class Queue định nghĩa method get() method put() Method put() sử dụng để đặt giá trị vào queue (gán giá trị cho exchangeValue), method get() sử dụng để nhận giá trị chứa queue (trả giá trị exchangeValue Khi giá trị gán, method put() thay đổi giá trị biến cờ từ false thành true xác định giá trị đặt vào queue Chú ý giá trị biến cờ sử dụng method get() method put() để có thread gọi method chờ có giá trị queue khơng có giá trị queue, phụ thuộc vào method gọi Class Publisher công bố instance class Queue sau gọi method put() đặt vào năm số nguyên integer queue Mặc dù method put() đặt vòng lặp for, số nguyên integer đặt vào queue, sau có khoảng tạm dừng số nguyên integer nhận class Consumer ... (InterruptedException e) { System.out.println("InterruptedException caught"); } } } Multithreading (đa tuyến) Java(phần 3) Ảnh hưởng quan trọng hai hay nhiều thread chia sẻ tài nguyên có số chúng... không chiếm dụng tài nguyên ngăn thread khác sử dụng Trong giới thực, thread thường tạm dừng sử dụng tài ngun tài ngun khác cần khơng có sẵn Trong suốt thời gian tạm dừng đó, hệ điều hành để thread... toán tử new khởi dựng class MyThread Cuối chương trình kết thúc việc hiển thị hai dịng hình Multithreading Java(phần 2) Phần tiếp tục trình bày cách tạo thread việc sử dụng từ khóa extends cách tạo

Ngày đăng: 10/11/2012, 11:36

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan