Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
107,61 KB
Nội dung
Chương Sử dụng đa luồng lập trình mạng Mục lục chương • • • • • • Cơ luồng Sử dụng luồng Java Đa luồng lập trình mạng Lock deaklock Đồng hóa luồng Non-blocking Server Cơ luồng • Một luồng (thread) dịng điểu khiển chương trình • Khơng giống tiến trình (process), luồng khơng cấp phát riêng vùng nhớ mà dùng chung vùng nhớ với chương trình • Điều có nghĩa chương trình server có nhiều u cầu kết nối đến, việc sử dụng thread giúp server không bị hết tài nguyên Cơ luồng • Trong thực tế, chương trình Java thực lng ln tạo • Thread thread (main thread) tạo hàm main thực hủy bỏ hàm main kết thúc • Nếu chương trình ta tạo thêm hàm khác chương trình gọi đa luồng (multithread) • Khi máy tính có có CPU thread thực Sử dụng luồng Java • Java ngơn ngữ hỗ trợ lập trình đa luồng đầy đủ mà khơng phải gọi hàm API • Tuy nhiên việc sử dụng luồng lập trình Java tương đối phức tạo đỏi hỏi cố gắng lập trình viên Sử dụng luồng Java • Trong java có hai cách để tạo lng là: – Tạo lớp thừa kế từ lớp Thread – Tạo lớp không thừa kế từ lớp Thread cài đặt giao tiếp Runnable Thừa kế lớp Thread • Phương thức run lớp Thread hành động Thread thực • Tuy nhiên phương thức main, phương thức run khơng gọi cách trực tiếp • Ta gọi đến phương thức start, phương thức tự động gọi đến phương thức run Thừa kế lớp Thread • Lớp Thread có hàm tạo hai hàm tạo sử dụng phổ biết – Thread() – Thread(String) – Nếu gọi hàm thứ ta cần tên thread, Nếu gọi hàm thứ tên thread là: Thread-n Thừa kế lớp Thread • Phương thức getName sử dụng để nhận lại tên Thread – Thread firstThread = new Thread(); – Thread secondThread = new Thread("namedThread"); – System.out.println(firstThread.getName()); – System.out.println(secondThread.getName()); Thừa kế lớp Thread • Phương thức sleep sử dụng để tạm dùng thread khoảng thời gian (miniseconds) – myThread.sleep(1500); • Phương thức interrupt sử dụng để phá vỡ thread sleeping 10 Lock deadlock • Tuy nhiên việc sử dụng lock lại phát sinh vấn đề khác deadlock • Deadlock trạng thái xảy thread đợi cho kiện kiện khơng xảy 31 Lock deadlock Ví dụ deadlock 32 Đồng hóa thread • Khóa (Locking) đạt cách đặt từ khóa synchronized trước phương thức đoạn code cần update • public synchronized void updateSum(int amount) • { • sum+=amount; • } 33 Đồng hóa thread • Nếu biến sum chưa khoa, đoạn code thực hiện, khóa biến sum • Tất thread muốn gọi đến phước thức phải đợi • Khi phương thức kết thúc, giải phóng khóa thread khác nhận khóa để thực phương thức 34 Đồng hóa thread • Để cải tiến hiệu Thread để tránh deadlock, ta dùng số phương thức sau: – wait(); – notify(); – notifyAll() 35 Đồng hóa thread • Nếu thread mn thực phương thức synchronized thấy khơng thể thực được, đưa vào trạng thái đợi cách gọi phương thức wait • Điều làm cho khóa thread giải phóng thread khác sử dụng khóa 36 Đồng hóa thread • Khi phướng thức hồn thành, notify notifyAll để đánh thức thread trạng thái waiting • Điểm khác biệt notify notifyAll phương thức đầu dùng trường hợp có thread trạng thái waiting • Chú ý phương thức wait, notify and notifyAll gọi thread có khóa 37 Ví dụ đồng hóa thread • Trong ví dụ ta xây dựng ứng dụng tốn kinh điển: producer-consumer • Người sản xuất (producer) tạo số tài nguyên người tiêu thụ mua (remove) tài ngun 38 Ví dụ đồng hóa thread • Các tài nguyên cài đặt lớp Resource • producer and consumer cài đặt lớp Producer and a ConsumerClient • Producer class lớp thread thừa kế từ lớp Thread 39 Ví dụ đồng hóa thread • Chương trình Server tạo đối tượng Resource thread Producer • Chương trình server sau start thread bắt đầu chấp nhận kết nối đến từ ConsumerClients • Mỗi kết nối tạo server tạo đối tượng lớp ClientThread để chịu trách nhiệm làm việc với Client 40 Ví dụ đồng hóa thread • Phương thức addOne of Resource gọi Producer object cố gắng thêm vào mức resource • Phương thức takeOne of Resource gọi ConsumerClient giam mức resource • Cả hai phương thức đề ảnh hưởng đến mức resource nên phải khai báo synchronized 41 Ví dụ đồng hóa thread • Trong ví dụ số lượng resource tạo khơng vượt q • Điểu thực cách phương thức addOne, ta gọi đến phương thức wait mức resource mức tối đa • Phương thức wait dừng Thread Producer giải phóng khóa resource chia sẻ 42 Ví dụ đồng hóa thread • Khi mà resource mức maximun, hàm addOne tắng mức lên gọi đến hàm notify để wake up tất thread ConsumerClient đợi • Mặt khác, consumer không phép tiêu thụ khơng có để tiêu thụ 43 Ví dụ đồng hóa thread • Đối tượng ClientThread tạo đối tượng ResourceServer xử lý tất yêu cầu tài nguyên từ client tương ứng • Trong ví dụ Client cho phép request item từ resource cách send Nếu muốn gắt kết nối send 44 • Cơng việc cuối ta cần làm tạo lớp ConsumerClient Lớp tương tự lớp MultiEchoClient mục trước 45