Lập trình đa luồng Multi Threaded Programming cùng một không gian bộ nhớ, và các luồng có thể cho phép chia sẻ các đối tượng dữ liệu để cùng xử lý... Giới thiệu HĐH đa nhiệm Hệ điều hà
Trang 1LẬP TRÌNH
ĐA LUỒNG (MULTITHREAD)
TRONG JAVA
Trang 2Nội dung
Trang 3Lập trình đơn luồng (Single Threaded Programming)
xử lý tuần tự
lỗi phát sinh ở đâu
chưa thực thi xong thì các câu lệnh khác không được chạy không hợp lý
Trang 4Lập trình đa luồng (Multi Threaded Programming)
cùng một không gian bộ nhớ, và các luồng có thể cho phép chia sẻ các đối tượng dữ liệu để cùng xử lý
Trang 5Giới thiệu HĐH đa nhiệm
Hệ điều hành đa nhiệm cổ điển:
Process là đoạn chương trình độc lập đã được nạp vào bộ nhớ
Mỗi process thi hành một ứng dụng riêng
Mỗi process có một không gian địa chỉ và một không gian
trạng thái riêng
Các process liên lạc với nhau thông qua cơ chế điều phối của HĐH
Trang 6 Hệ điều hành đa nhiệm hiện đại, hỗ trợ thread:
Thread một đoạn các câu lệnh được thi hành
Mỗi process có một không gian địa chỉ và nhiều thread
Trang 7 Luồng 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,
Trang 8Main Thread
Các thread có thể chuyển đổi dữ liệu với nhau
Chương trình Multithread
Trang 9Ứng dụng Multithread
9
Printing Thread
Editing Thread
Trang 10Lập trình multithread với Java
public class Thread extends Object { … }
public interface Runnable { public void run(); // work thread }
+isAlive() +join() +interrupt() +start() +stop()
Trang 11Lớp java.lang.Thread
của lớp Thread
public static synchronized void start() :
Trang 12 public void run():
public void stop() : kết thúc một thread
Lớp java.lang.Thread
Trang 13Tạo và quản lý thread
được thực thi Luồng này được tạo ra một cách tự động tại đây:
luồng chính ngừng thực thi, chương trình bị chấm dứt
Trang 14Tạo thread sử dụng lớp Thread
class MyThread extends Thread
Trang 15Ví dụ
public void run() {
System.out.println(" this thread is running "); }
} // end class MyThread
Trang 16Ví dụ
class ThreadEx1 { // a program that utilizes the thread
public static void main(String [] args ) {
MyThread t = new MyThread();
t.start();
} // end main()
} // end class ThreadEx1
Trang 17Tạo thread sử dụng Runnable
class MyThread implements Runnable {
public void run() {
}
}
Trang 18Tạo thread sử dụng Runnable
MyThread myObject = new MyThread();
Thread thr1 = new Thread(myObject);
thr1.start();
Trang 19class MyThread implements Runnable {
public void run() {
System.out.println(" this thread is running "); }
} // end class MyThread
Ví dụ
Trang 20class ThreadEx2 {
public static void main(String [] args ) {
Thread t = new Thread(new MyThread());
t.start();
} // end main()
} // end class ThreadEx2
Ví dụ
Trang 21Threads – Thread States
Trang 22Vòng đời của thread
yield, time slice
notify, notifyAll,
IO complete, sleep expired, join complete
Trang 24 Viết chương trình thi hành song song 3 thread
class A extends Thread {
public void run() {
Trang 25class B extends Thread {
public void run() {
Trang 26class C extends Thread {
public void run() {
Trang 30Độ ưu tiên
của thread Khi thread được tạo ra có độ ưu tiên mặc định
Trang 31Ví dụ về thread priority
class A extends Thread {
public void run() {
Trang 32Ví dụ về thread priority
class B extends Thread {
public void run() {
Trang 33Ví dụ về thread priority
class C extends Thread {
public void run() {
Trang 35Threads – Scheduling
Trang 36thi hành một khoảng thời gian ngẫu nhiên
Trang 371 // ThreadTester.java
2 // Show multiple threads printing at different intervals
3
4 public class ThreadTester {
5 public static void main( String args[] )
6 {
7 PrintThread thread1, thread2, thread3, thread4;
8
9 thread1 = new PrintThread( "thread1" );
10 thread2 = new PrintThread( "thread2" );
11 thread3 = new PrintThread( "thread3" );
12 thread4 = new PrintThread( "thread4" );
25 class PrintThread extends Thread {
26 private int sleepTime;
27
28 // PrintThread constructor assigns name to thread
29 // by calling Thread constructor
main kết thúc khi thread cuối cùng kết thúc
Trang 3830 public PrintThread( String name )
31 {
32 super( name );
33
34 // sleep between 0 and 5 seconds
35 sleepTime = (int) ( Math.random() * 5000 );
41 // execute the thread
42 public void run()
53 // print thread name
54 System.err.println( getName() + " done sleeping" );
55 }
56 }
Gọi constructor lớp cha
Sleep có thể ném ra biệt lệ Công việc của thread
Trang 42public static void main(String[] args) {
Parentheses p = new Parentheses();
MyThread name1 = new MyThread(p, "Bob");
MyThread name2 = new MyThread(p, "Mary");