Thông tin tài liệu
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
Ngày đăng: 27/07/2023, 08:34
Xem thêm: