Khi thread được start, nó sẽ gọi thực thi lệnh trong phương thức run() của Runnable liên kết với nó. 19.[r]
Trang 1Nguyễn Hữu Thể
LẬP TRÌNH HỆ THỐNG MẠNG
Trang 2THREAD
― Hệ điều hành đa nhiệm cổ điển:
Đơn vị cơ bản sử dụng CPU là quá trình
Mỗi quá trình có một không gian địa chỉ và một không gian trạng
thái riêng
― Hệ điều hành đa nhiệm hiện đại, hỗ trợ Thread:
Đơn vị cơ bản sử dụng CPU là Thread
Mỗi quá trình có một không gian địa chỉ và nhiều Thread điều khiển
Mỗi Thread có bộ đếm chương trình, trạng thái các thanh ghi và
ngăn xếp riêng
Thread của một quá trình có thể chia sẻ nhau không gian địa chỉ :
Biến toàn cục, tập tin, chương trình con, hiệu báo,
― Thread chia sẻ thời gian sử dụng CPU => Thread cũng có các
Trang 3Multi-Thread
3
Trang 4Multi-Thread (2)
― Ví dụ:
So sánh thời gian chạy giữa các giải thuật Sort:
Trang 5Multi-Thread (3)
― Thread trong Java là một đối tượng của lớp java.lang.Thread
― Một chương trình cài đặt Thread bằng cách tạo ra các lớp con của lớp Thread
― Lớp Thread có 3 phương thức cơ bản:
public static synchronized void start () :
• Chuẩn bị mọi thứ cần thiết để thực hiện Thread
public void run ():
• Chứa mã lệnh thực hiện công việc thực sự của Thread
• run() được gọi một cách tự động bởi start()
public void stop () : kết thúc một Thread
― Thread kết thúc khi:
Hoặc tất cả các lệnh trong run() đã được thực thi
Hoặc phương thức stop() của Thread được gọi 5
Trang 6Multi-Thread (4)
― Để lập trình đa tiến trình, lớp dẫn xuất từ lớp Thread được
cài đặt sau đó override phương thức run()
― Khi tiến trình cần chạy thì phương thức start() của tiến
trình được gọi thực hiện.
Trang 7 Do đó, ta dùng các constructor của lớp dẫn xuất chứ không
dùng các constructor của thread một cách trực tiếp.
7
Trang 8Thread - constructor
― Các constructor:
Thread() Tạo Thread với giá trị mặc định
Thread(String name) Tạo Thread với tên cho trước
Thread(Runnable target) Tạo thread liên kết với đối tượng Runnable
Thread(Runnable target, String
name)
Tạo Thread liên kết với đối tượng Runnable
và có tên cho trước
Trang 9Thread – Cấu trúc chương trình
class MyThread extends Thread // Kế thừa lớp Thread
Tạo đối tượng Thread và gọi thực thi:
MyThread t = new MyThread(); // Tạo tiểu trình
9
Trang 10Ex 1: Lớp MyThread cơ bản
class MyThread extends Thread { // Kế thừa lớp Thread
public void run() // Override phương thức run
public static void main(String[] args) {
MyThread t1 = new MyThread(); // Tạo Thread
MyThread t2 = new MyThread();
Trang 11Ex 1: Lớp MyThread cơ bản – Kết quả
Trang 12Ex 2: MyThread2
― Các thuộc tính
name: tên của thread
n: số lần thread xuất hiện ra màn hình
― Các phương thức:
MyThread2(String name, int n):
• Là phương thức khởi tạo, có nhiệm vụ gán giá trị cho 2 thuộc tính và gọi phương thức start() để cho thread hoạt động (start() tự động gọi run())
run()
• In n lần dòng thông báo ra màn hình rồi kết thúc thread
Trang 13this name = name;
this n = n;
System.out.println ( "Thread " + name + " has been created." );
start();
}
public void run() {
for (int i = 0; i < n ; i++) {
System.out.println( "Hello, I'm " + name );
System.out.println( " I go to bed now, bye bye." ); }
}
public static void main(String args[]) {
int n = 10;
int numThread = 4;
for (int i = 0; i < numThread; i++) {
MyThread2 t = new MyThread2( "Thread" + i, n);
} }
}
Trang 14Ex 2: MyThread2 (3) – Kết quả
Thread Thread0 has been created !
Thread Thread1 has been created !
Hello, I'm Thread0
I go to bed now, bye bye
Thread Thread2 has been created !
Hello, I'm Thread1
I go to bed now, bye bye
Hello, I'm Thread0
I go to bed now, bye bye
Hello, I'm Thread1
I go to bed now, bye bye
Thread Thread3 has been created !
Hello, I'm Thread1
I go to bed now, bye bye
Hello, I'm Thread0
I go to bed now, bye bye
Hello, I'm Thread2
Hello, I'm Thread1
I go to bed now, bye bye Hello, I'm Thread3
I go to bed now, bye bye Hello, I'm Thread0
I go to bed now, bye bye Hello, I'm Thread3
I go to bed now, bye bye Hello, I'm Thread2
I go to bed now, bye bye Hello, I'm Thread3
I go to bed now, bye bye Hello, I'm Thread0
I go to bed now, bye bye Hello, I'm Thread1
I go to bed now, bye bye Hello, I'm Thread0
Trang 15o public final void suspend()
o Chuyển Thread từ trạng thái sẳn sàng sang trạng thái nghẽn
o public final void resume()
o Chuyển Thread từ trạng thái nghẽn sang trạng thái sẵn sàng
o public final void yield()
o Chuyển Thread từ trạng thái đang chạy sang trạng thái sẵn sàng
15
Trang 17Thực thi thread
― Để thực thi thread, ta gọi phương thức void start()
― Khi được thực thi, thread sẽ chạy các lệnh trong phương thức
Trang 19Interface Runnable
― Có thể tạo class implement interface Runnable
Class phải hiện thực phương thức void run() của interface này.
Tạo thread liên kết với Runnable thông qua constructor tương ứng của lớp Thread
Khi thread được start, nó sẽ gọi thực thi lệnh trong phương
thức run() của Runnable liên kết với nó.
19
Trang 20Runnable - EX 1
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
Trang 21public RunnableThread(String threadName) {
runner = new Thread( this , threadName); //(1)Create a new thread
System.out.println( runner getName());
runner start(); // (2) Start the thread.
}
public void run() { // Display info about this particular thread
System.out println(Thread.currentThread());
}
public static void main(String[] args) {
Thread thread1 = new Thread( new RunnableThread(), "thread1" ); Thread thread2 = new Thread( new RunnableThread(), "thread2" ); RunnableThread thread3 = new RunnableThread( "thread3" );
// Display info about the main thread
System.out println(Thread.currentThread());
} }
thread3 Thread[thread3,5,main] Thread[thread1,5,main] Thread[thread2,5,main] Thread[main,5,main]