Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

Xử lý đa luồng trong Java

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
Xử lý đa luồng trong Java

n Thực thi của Java cũng chính là đa luồng

Network programming 2
Khởi tạo luồng

n Có 2 cách khởi tạo luồng


q Kế thừa lớp Thread
n Tạo một lớp kế thừa lớp Thread và thay thế hàm run()
q Thực thi Runnable Interface
n Thực thi Runnable Interface và chuyển đối tượng
Runnable vào hàm khởi tạo Thread

Network programming 3
Kế thừa lớp Thread
Đối tượng của
Lớp Thread Lớp kế thừa lớp kế thừa

start () start () Khởi tạo start ()


thay thế đối tượng
run() run() run()
… Kế thừa … …

Network programming 4
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 5
public static void main(String[] args){
// Tạo 2 đối tượng kiểu ExThread
ExThread t1 = new ExThread();
ExThread t2 = new ExThread();

// Bắt đầu thực thi luồng mới


t1.start();
t2.start();
}
}

Network programming 6
Thực thi Runnable interface
Runnable Interface Lớp thực thi
thực thi
run() run()

Khởi tạo
đối tượng
Đối tượng của
Đối tượng của lớp Thread
Lớp Thread run()
lớp thực thi
start () start ()
run() run()
… …
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 )

Network programming 7
Ví dụ về thực thi Runnable Interface
import java.io.*;

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) {
}
}
}
Network programming 8
Ví dụ về thực thi Runnable Interface (2)
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 9
Kế thừa Thread hay thực thi Runnable
interface
n 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
}

Network programming 10
Tuổi sống của một luồng
Có khả
Lập lịch
Khởi tạo năng thi Thi hành
hành

Không được
thi hành
Kết thúc
sleep
sleep sleep()

notìfy()
wait
notifyAll() wait()
blocking
I/O
Xử lý synchronized
lock
Xóa lock

Network programming 11
Máy chủ xử lý đồng thời đa luồng hướng
kết nối

master

thread1 thread2 threadn Server


application
processes

Socket for socket for individual Operating


connection connections system
requests
Network programming 12
Thực thi máy chủ xử lý đồng thời đa
luồng hướng kết nối
1. Bước 1 Luồng chính Tạo một đối tượng
ServerSocket
ServerSocket servSocket = new
ServerSocket(1234);
2. 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 13
Thực thi máy chủ xử lý đồng thời đa
luồng hướng kết nối(2)
n Bước 1 luồng con: Hàm Run() xử lý yêu cầu củ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
n Bước 2 luồng con: Đóng socket kết nối và trả về

Network programming 14
Ví dụ về máy chủ Echo

n EchoServer.java

Network programming 15
Loại trừ lẫn nhau
n Các luồng chia xẻ bộ nhớ, xử lý file (file handles), sockets, và
các tài nguyên khác
n 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

Network programming 16
Khối đồng bộ hóa
n Ấn định việc truy cập có loại trừ vào một đối tượng bởi từ khóa
synchronized
q Để 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


q Dừng tất cả các luồng sử dụng một tài nguyên chung

n 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.
q E.g.
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
Hàm đồng bộ hóa
n Đồ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
n Dùng đồng bộ hóa có thể
q Giảm tốc độ xử lý của chương trình đến 3 lần hay hơn
q Làm tăng khả năng deadlock xảy ra

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");
}

Network programming 18

You might also like