12/6/2007
Xử lý đa luồng trong Java
Xử lý đa luồng trong Java
Thực thi của Java cũng chính là đa luồng
Giảng viên: Nguyễn Hoài Sơn Bộ môn Mạng và Truyền thông máy tính Khoa Công nghệ thông tin
Network programming
1
Khởi tạo luồng
Kế thừa lớp Thread
Có 2 cách khởi tạo luồng
Lớp Thread
Kế thừa lớp Thread
start () run() …
Tạo một lớp kế thừa lớp Thread và thay thế hàm run()
Thực thi Runnable Interface
2
Network programming
Đối tượng của lớp kế thừa
Lớp kế thừa thay thế
Kế thừa
start () run() …
Khởi tạo đối tượng
start () run() …
Thực thi Runnable Interface và chuyển đối tượng Runnable vào hàm khởi tạo Thread
Network programming
3
Network programming
public static void main(String[] args){ // Tạo 2 đối tượng kiểu ExThread ExThread t1 = new ExThread(); ExThread t2 = new ExThread();
Ví dụ về kế thừa lớp Thread import java.io.*; class ExThread extends Thread{ // kế thừa lớp Thread public void run() { // Hàm thực thi của luồng for(int i = 1; i <= 10; i++) { System.out.println(getName() + ":" + i); try { sleep(1000); } catch (InterruptedException e) { } } } Network programming
4
// Bắt đầu thực thi luồng mới t1.start(); t2.start(); } }
5
Network programming
6
1
12/6/2007
Thực thi Runnable interface Lớp thực thi
Runnable Interface run()
thực thi
import java.io.*;
run() Khởi tạo đối tượng
Đối tượng của lớp thực thi
run()
Lớp Thread start () run() …
Ví dụ về thực thi Runnable Interface
Khởi tạo đối tượng (gán tham số cho hàm khởi tạo là đối tượng của lớp thực thi Runnable interface )
class ThreadRunnable implements Runnable{ public void run() { for(int i = 1; i <= 10; i++) { //(3) System.out.println("thread"+ ":" + i); try { Thread.sleep(1000); } catch (InterruptedException e) { } } }
Đối tượng của lớp Thread
start () run() …
Network programming
7
Ví dụ về thực thi Runnable Interface (2)
Kế thừa Thread hay thực thi Runnable interface
public static void main(String[] args){ ThreadRunnable tr1 = new ThreadRunnable(); ThreadRunnable tr2 = new ThreadRunnable(); Thread t1 = new Thread(tr1); Thread t2 = new Thread(tr2); t1.start(); t2.start(); }
}
Network programming
Có khả năng thi hành
Lập lịch
Phải thực thi Runnable trong trường hợp muốn kế thừa một lớp khác không phải Thread class ExAppletThread extends Applet, Thread { …. }
X
class ExAppletThread extends Applet implements Runnable { …. }
O
9
10
Network programming
Máy chủ xử lý đồng thời đa luồng hướng kết nối
Tuổi sống của một luồng Khởi tạo
8
Network programming
Thi hành
master Không được thi hành Kết thúc sleep notìfy() notifyAll()
sleep wait
thread1
sleep()
thread2
threadn
wait()
blocking I/O
Xóa lock
lock
Server application processes
Socket for connection requests
Xử lý synchronized
Network programming
11
socket for individual connections Network programming
Operating system 12
2
12/6/2007
Thực thi máy chủ xử lý đồng thời đa luồng hướng kết nối 1.
2.
Bước 1 Luồng chính Tạo một đối tượng ServerSocket
ServerSocket servSocket = new ServerSocket(1234); Bước 2 Luồng chính Lặp lại vòng lặp 1. Đưa máy chủ vào trạng thái chờ Socket link = servSocket.accept(); 2. Tạo một đối tượng Thread và gọi hàm start() để thi hành luồng mới
Network programming
Network programming
Network programming
16
Hàm đồng bộ hóa
Ấn định việc truy cập có loại trừ vào một đối tượng bởi từ khóa synchronized Để thi hành một số dòng codes cùng nhau, gói chúng lại trong một khối đồng bộ hóa Dừng tất cả các luồng sử dụng một tài nguyên chung
14
Các luồng chia xẻ bộ nhớ, xử lý file (file handles), sockets, và các tài nguyên khác Nếu hai luồng muốn sử dụng cùng một tài nguyên tại một thời điểm nào đó, một trong 2 luồng phải đợi luồng kia kết thúc việc sử dụng tài nguyên
15
Khối đồng bộ hóa
máy khách Gửi và nhận dữ liệu thông qua đối tượng socket kết nối x Bước 2 luồng con: Đóng socket kết nối và trả về
Loại trừ lẫn nhau
EchoServer.java
Network programming
Bước 1 luồng con: Hàm Run() xử lý yêu cầu của
13
Ví dụ về máy chủ Echo
Thực thi máy chủ xử lý đồng thời đa luồng hướng kết nối(2)
Đồng bộ tất cả hàm trên đối tượng hiện tại (tham chiếu thís) bằng việc thêm từ khóa synchronized vào khai báo hàm Dùng đồng bộ hóa có thể
Giảm tốc độ xử lý của chương trình đến 3 lần hay hơn Làm tăng khả năng deadlock xảy ra
Chỉ ngăn cản các luồng đồng bộ hóa trên cùng một đối tượng không sử dụng tài nguyên chung.
E.g.
public synchronized void writeEntry(String message) throws IOException { Date d = new Date( ); out.write(d.toString( )); out.write('\t'); out.write(message); out.write("\r\n"); }
synchronized (System.out) { System.out.print(input + ": "); for (int i = 0; i < digest.length; i++) { System.out.print(digest[i] + " "); } System.out.println( ); } Network programming
17
Network programming
18
3