Đa nhiệm và đa tuyến trong Java - Multithreading

23 419 1
Tài liệu đã được kiểm tra trùng lặp
Đa nhiệm và đa tuyến trong Java - Multithreading

Đ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

Lập trình Java cơ bản 1 Cao Đức Thông - Trần Minh Tuấn cdthong@ifi.edu.vn , tmtuan@ifi.edu.vn Bài 9. Multithreading 2 • Đa nhiệm đa tuyến • Tạo lập sử dụng tuyến • Lớp Thread • Giao tiếp Runnable • Đồng bộ hoá các tuyếnTuyến ma • Nhóm tuyến • Bài tập Đa nhiệm(multitasking) 3 • Đa nhiệm là kỹ thuật cho phép nhiều công việc đượcthực hiệncùngmột lúc trên máy tính. • Nếu có nhiều CPU, các công việc có thể được thực hiện song song trên từng CPU. Trong trường hợp nhiều công việc cùng chia sẻ một CPU, từng phần của mỗi công việc sẽ được CPU thực hiện xen kẽ. Đa nhiệm(multitasking) 4 Task 1 Task 2 Task 3 Nhiềucông việc thi hành trên mộtCPU Đa nhiệm(multitasking) 5 • Hai kỹ thuật đa nhiệmcơ bản • Đatiến trình (Process-based multitasking): Nhiềuchương trình chạy đồng thời. Mỗi chương trình có một vùng dữ liệu độc lập. • Đatuyến (Thread-based multitasking): Mộtchương trình có nhiều tuyến cùng chạy đồng thời. Các tuyến dùng chung vùng dữ liệu của chương trình. Tuyếnvàđatuyến 6 • Tuyếnlàmạch thi hành độc lập củamộttác vụ trong chương trình. • Mộtchương trình có nhiềutuyếnthựchiện cùng lúc gọilàđatuyến. program program Tạo tuyến 7 • Tuyến trong Java cũng là các đối tượng. • Có hai cách để tạotuyến • Thừakế từ lớp java.lang.Thread • Cài đặtgiaotiếp java.lang.Runnable Cách 1: Kế thừa từ Thread 8 Tạo lớp MyThread kế thừa từ Thread nạp chồng phương thức run() của lớp Thread. class MyThread extends Thread { …. public void run() { … } } Tạo thực thi tuyến. Thread th1 = new MyThread(); Thread th2 = new MyThread(); th1.start(); th2.start(); Cách 1: Kế thừa từ Thread 9 • Khi một tuyến được tạo ra, nó cần gọi start() để đặt tuyến ở trạng thái sẵn sàng. Tiếp theo hệ thống sẽ thực thi các câu lệnh trong run() của tuyến đó. • Tuyến sẽ kết thúc khi làm hết lệnh trong run() hoặc khi stop() được gọi. Tạo tuyến 10 Tạotuyếnmới MyThread th1 = new MyThread(); MyThread th2 = new MyThread(); … th1.start(); th2.start(); … Sẵn sàng bắt đầu thực thi tuyến [...]... Đồng bộ hoá tuyến • Việc các tuyến trong chương trình cùng truy nhập vào một đối tượng có thể sẽ đem lại kết quả không như mong muốn Ví dụ: Tuyến A cập nhật đối tượng X tuyến B đọc dữ liệu từ X Rất có thể xảy ra sự cố là tuyến B đọc dữ liệu chưa được cập nhật • Đồng bộ hoá tuyến (thread synchronization) giúp cho tại mỗi thời điểm chỉ có một tuyến có thể truy nhập vào đối tượng còn các tuyến khác... chưa kết thúc tuyến cũng phải tạm dừng để cho các tuyến khác cùng độ ưu tiên dùng CPU • Các tuyến cùng độ ưu tiên luân phiên sử dụng CPU theo kiểu xoay vòng (roundrobin) 13 Bộ lập lịch Priority 10 Ví dụ: Tuyến A B sẽ luân phiên nhau thực thi cho đến khi kết thúc Tiếp theo tuyến C sẽ thực thi đến khi kết thúc Tiếp theo tuyến D, E F sẽ luân phiên thực thi đến khi kết thúc Tiếp theo tuyến G thực... 10) • Tuyến có độ ưu tiên càng cao thì càng sớm được thực hiện hoàn thành • Độ ưu tiên mặc định của các tuyến là Thread.NORM_PRIORITY (giá trị 5) • Một tuyến mới sẽ thừa kế độ ưu tiên từ tuyến tạo ra nó 12 Bộ lập lịch • Bộ lập lịch (scheduler) của Java quản lý các tuyến theo cơ chế phân chia thời gian (timeslicing) Từng tuyến sẽ được cấp một khoảng thời gian ngắn (time quantum) để sử dụng CPU Trong. .. thực thi đến khi kết thúc Cuối cùng tuyến H I luân phiên thực thi đến khi kết thúc Nhận xét: Các tuyến có độ ưu tiên thấp sẽ có nguy cơ bị trì hoãn vô hạn định A Priority 9 B C Priority 8 Priority 7 D Priority 6 E F G Priority 5 Priority 4 Priority 3 Priority 2 H I Priority 1 14 Ví dụ về đa tuyến • Tạo ra 3 tuyến với độ ưu tiên mặc định Công việc của mỗi tuyến là ngủ trong một thời gian ngẫu nhiên từ... Runnable Trong trường hợp lớp đã kế thừa từ một lớp khác, cần cài đặt giao tiếp Runnable để lớp có thể là một tuyến Runnable có duy nhất một phương thức run() Tạo thực thi tuyến class MyClass extends SomeClass implements Runnable { … public void run() { … } } Thread th1 = new Thread(new MyClass()); Thread th2 = new Thread(new MyClass()); th1.start(); th2.start(); 11 Độ ưu tiên • Các tuyến trong Java. .. Ví dụ: Trong khi tuyến A cập nhật X thì tuyến B chưa được đọc 22 Đồng bộ hoá tuyến • Dùng từ khoá synchronized trên các phương thức để thực hiện đồng bộ hoá • Đối tượng khai báo phương thức synchronized sẽ có một bộ giám sát (monitor) Bộ giám sát đảm bảo tại mỗi thời điểm chỉ có một tuyến được gọi phương thức synchronized • Khi một tuyến gọi phương thức synchronized, đối tượng sẽ bị khoá Khi tuyến đó... thời gian ngẫu nhiên từ 0 đến 5 giây Sau khi ngủ xong, các tuyến sẽ thông báo ra màn hình 15 Ví dụ về đa tuyến class PrintThread extends Thread { private int sleepTime; public PrintThread( String name ) { super( name ); sleepTime = ( int ) ( Math.random() * 5000); System.out.println( getName() + " have sleep time: " + sleepTime); } 16 Ví dụ về đa tuyến // method run is the code to be executed by new thread... của Thread • • • • • • • void void void void void void void sleep(long millis); // ngủ yield(); // nhường điều khiển interrupt(); // ngắt tuyến join(); // yêu cầu chờ kết thúc suspend(); // deprecated resume(); // deprecated stop(); // deprecated 20 Vòng đời của tuyến born start read y p le sl ee p n e slee ping et pl wa iting m it wa issu e I/ O re qu e st ti o running co no or n t ify ot i fy Al... Thread.sleep( sleepTime ); } // sleep() may throw an InterruptedException catch ( InterruptedException e) { e.printStackTrace(); } System.out.println( getName() + " done sleeping" ); } } 17 Ví dụ về đa tuyến public class ThreadTest { public static void main( String [ ] args ) { PrintThread thread1 = new PrintThread( "thread1" ); PrintThread thread2 = new PrintThread( "thread2" ); PrintThread thread3... thread1.start(); // start and ready to run thread2.start(); // start and ready to run thread3.start(); // start and ready to run System.out.println( "Threads started, main ends\n" ); } } 18 Ví dụ về đa tuyến thread1 have sleep time: 622 thread2 have sleep time: 4543 thread3 have sleep time: 1622 Starting threads Threads started, main ends thread1 thread2 thread3 thread1 thread3 thread2 starts to sleep . trình Java cơ bản 1 Cao Đức Thông - Trần Minh Tuấn cdthong@ifi.edu.vn , tmtuan@ifi.edu.vn Bài 9. Multithreading 2 • Đa nhiệm và đa tuyến • Tạo lập và sử. và sử dụng tuyến • Lớp Thread • Giao tiếp Runnable • Đồng bộ hoá các tuyến • Tuyến ma • Nhóm tuyến • Bài tập Đa nhiệm( multitasking) 3 • Đa nhiệm là kỹ

Ngày đăng: 06/10/2013, 09:20

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

Tài liệu liên quan