Truyền thống: Một tiến trình có một luồng điều khiển đơn: Chỉ có một tuyến đoạn đang chạy tại một thời điểm cho trước.. Hệ điều hành duy trì một hàng đợi các tuyến đoạn và phân bổ th
Trang 1Chapter 6 Threads in Java
1
Trang 2 Explain how to set thread priorities
Describe a daemon thread
Objectives
2
Trang 3 Multitasking:
trên một CPU (đơn nhân)
chương này sang chương trình khác (ms).
Process
các tài nguyên khác -> 1 process.
Trang 4 Thread là đơn vị nhỏ nhất trong mã chương trình có thể thực thi một công việc riêng biệt.
Thread hình thành gồm:
một định danh luồng (thread ID),
một bộ đếm chương trình,
tập thanh ghi và ngăn xếp
Nó chia sẻ với các luồng khác thuộc cùng một tiến trình phần
mã, phần dữ liệu, và tài nguyên hệ điều hành như các tập tin đang mở và các tín hiệu
Thread
4
Trang 5 Truyền thống: Một tiến trình có một luồng điều khiển đơn:
Chỉ có một tuyến đoạn đang chạy tại một thời điểm cho trước Các tuyến đoạn khác phải chờ
Hệ điều hành duy trì một hàng đợi các tuyến đoạn và phân bổ thời gian CPU cho chúng
Gây lãng phí CPU và bộ nhớ
nó có thể thực hiện nhiều hơn một tác vụ tại một thời điểm
Khi đó, các tuyến đoạn có thể truy xuất tới tài nguyên dùng chung để cùng làm việc hợp tác với
MultiThread
5
Trang 6Single vs Multi-Threaded
6
Trang 7Step 1 Step 2 … Step n
Single vs Multi-Threaded
7
• A process that is made of one thread is known as
• A process that creates two or more threads is
called a multithreaded process
Trang 8Applications of Multithread
văn bản; Thread lấy dữ liệu từ mạng…
sự nhấn phím của NSD; Thread kiểm tra chính tả…
8
Trang 9 Thread cũng đóng một vai trò quan trọng trong hệ thống lời gọi thủ tục xa (RPC)
nó phục vụ thông điệp dùng một thread riêng Điều này cho phép phục vụ nhiều yêu cầu
đồng hành.
Applications of threads
9
Trang 10 Sự đáp ứng:
đa luồng một ứng dụng giao tiếp cho phép một chương
trình tiếp tục chạy thậm chí nếu một phần của nó bị khóa (wait) hay đang thực hiện một thao tác dài,
do đó gia tăng sự đáp ứng đối với người dùng
Mặc định, các luồng chia sẻ bộ nhớ và các tài nguyên
của các quá trình mà chúng thuộc về
Thuận lợi của việc chia sẻ là nó cho phép một ứng dụng
có nhiều hoạt động của các luồng khác nhau nằm trong cùng không gian địa chỉ
Benefits of Multithreading
10
Trang 11 các lợi điểm của đa luồng có thể phát huy trong kiến trúc
đa xử lý, ở đó mỗi luồng thực thi song song trên một bộ
xử lý khác nhau
Một quá trình đơn luồng chỉ có thể chạy trên một CPU
Đa luồng trên một máy nhiều CPU gia tăng tính đồng hành
Benefits of Multithreading
11
Trang 12 Multithreading requires less overhead than multitasking.
không gian địa chỉ của chúng và khác nhau giữa các tiến trình
đòi hỏi nhiều tài nguyên của hệ thống (cả ram và CPU)
không gian địa chỉ
hiệu quả cao với sự tận dụng CPU là tối đa bằng cách duy trì thời gian trễ là tối thiểu.
Multithreading vs multitasking
12
Trang 13 Thread nhân:
quản lý không gian nhân
viện luồng tại cấp người dùng
trong không gian người dùng mà không cần sự can thiệp của nhân
Hai loại Thread
13
Trang 14 Java là một trong số nhỏ ngôn ngữ cung cấp sự hỗ trợ tại cấp ngôn ngữ cho việc tạo và quản lý luồng
Tuy nhiên, vì các luồng được quản lý bởi máy ảo Java (JVM), không bởi một thư viện cấp người dùng hay nhân
Một chương trình Java có ít nhất 1 Thread, nó được gọi thực hiện khi phương thức main chạy (như một luồng đơn trong máy ảo Java)
Trang 15 Every Thread has a state and a Thread can be in one of these six states.
new A state in which a thread has not been started
runnable A state in which a thread is executing
blocked A state in which a thread is waiting for a lock to
access an object
waiting A state in which a thread is waiting indefinitely for
another thread to perform an action
timed waiting A state in which a thread is waiting for up
to a specified period of time for another thread to perform
an action
terminated A state in which a thread has exited.
Six states of Thread
15
Trang 16 Tạo tuyến đoạn mới:
Thread newThread = new Thread(“threadName“);
newThread.start();
có ngoại lệ IllegalThreadStateException
được đưa ra
The New Thread State
16
Trang 17 Một tuyến đoạn ở trạng thái runnable mỗi khi
run() có thể được xử lý bất kỳ khi nào giành
được quyền xử lý từ hệ điều hành
The Runnable thread state
17
Trang 18Một tuyến đoạn ở not runnable state (blocked) khi:
Tuyến đoạn sẽ tạm dừng sau một số ms xác định
tượng: Tuyến đoạn sẽ not runnable cho tới khi
được gọi từ một tuyến đoạn khác
vào/ra Tuyến đoạn sẽ not runnable cho tới khi hoạt động vào ra hoàn thành.
The not Runnable Thread State
18
Trang 19 A thread có thể dead or alive
Dead khi phương thức run() hoàn thành việc xử lý.
Dead khi gán giá trị null cho đối tượng
Trang 20Different thread states
New Thread (BORN)
Trang 21Main Thread
21
một thread
trong method : public static void main Đây là một điểm nhập bắt buộc cho mọi ứng dụng độc lập.
main thread : Tuyến đoạn đầu tiên thực hiện trong ứng dụng đa tuyến đoạn, được tạo ra tự động
Trang 22Main Thread
22
• currentThread(): phương thức được dùng để truy
nhập vào main thread.
public static void main(String args[]) { Thread t= Thread.currentThread();
System.out.println(" The current thread: " + t);
t.setName("MainThread");
System.out.println(“The current thread after name change:”+ t);
… }
Trang 23 Có thể 2 cách:
override the run() method of the Thread class.
define the run() method.
Create Thread
23
Trang 24 Lớp java.lang.Thread cung cấp các phương thức quản lý, kiểm soát độ ưu tiên của tuyến đoạn :
Nó được gọi khi khởi động tuyến đoạn lần đầu
Một tuyến đoạn có thể thực hiện một số tác vụ hữu ích
ở hậu trường
Dùng Thread class
24
Trang 25class Th_ex extends Thread {
{ }
public static void main(String args[]){
Th_ex T = new Th_ex();
//Kích hoạt đoạn tuyến khởi động
T.start();
} }
Dùng Thread class -
25
Trang 26public class HelloThread extends Thread {
{ System.out.println("Hello from athread");
} public static void main(String args[])
{ (new HelloThread()).start() ; }
}
Thread class, ex
26
Trang 27 void start() : Gọi một thread khởi động
final boolean isAlive() : kiểm tra thread
còn chạy không.
final String getName() : trả về tên của
thread.
final void setName(String name) : thiết
đặt tên cho thread
Some methods of thread class
27
Trang 28} catch(InterruptedException e) { }
} }28
Trang 29class MyThread extends Thread {
public static void main(String args[]) {
MyThread Objex = new MyThread();
//Add more threads or:
Objex.create() ; System.out.println("This is the main thread");
} public void create()
{ Thread Objth1 = new Thread(this);
Thread Objth2 = new Thread(this);
Thread Objth3 = new Thread(this);
Objth1.start(); Objth2.start(); Objth3.start();
} public void run() { while (true) { try { System.out.println("This is the child thread");
Thread.sleep(1000);
} catch(InterruptedException e) { }
} } }
Ex MultiThread
29
Trang 30 Mỗi Thread tạo ra đều thực thi các tác vụ giống nhau (theo run())
nhau?
riêng cho mỗi thread.
Ex MultiThread
30
Trang 31class TichTac extends Thread {
String word ;
int delay ;
TichTac(String s, int d)
{ word =s;
{ System.out print( "Stop ct" );
} }
{ new TichTac( "Tich" ,330).start();
new TichTac( "Tac" ,1000).start();
new TichTac( “tac" ,500).start();
ex
31
Trang 32public class Thread_ex extends Thread{
String name ; Thread_ex (String name){
this name = name;
}
public static void main(String args[]) {
Thread_ex Objex1 = new Thread_ex( "Thr1" );
Thread_ex Objex2 = new Thread_ex( "Thr2" );
Thread_ex Objex3 = new Thread_ex( "Thr3" );
Trang 33class arrThread extends Thread {
… public void run(){…}
}
//New Thread
Trang 34private static class Tinh extends Thread {
}
System.out println( "Thread " + id + " counted " +
} }
MultiThread using array ex,
Tinh[] worker = new Tinh[numThreads];
for ( int i = 0; i < numThreads; i++) {
worker[i] = new Tinh( i );
worker[i].start();
}
Trang 35 Interface Runnable
chạy như các tuyến đoạn
tương tranh có thể sử dụng chung mã và thao tác trên cùng dữ liệu
Dùng Interface Runnable
35
Trang 36class C2 implements Runnable
{ public C2()
{Thread t = new Thread(this);}
public void run(){ }
}
Dùng Interface Runnable
36
Trang 37public class HelloRunnable implements Runnable {
public void run()
{ System.out.println("Hello from a thread!"); }
public static void main(String args[])
{
}}
Runnable, ex
37
Trang 38class Run_ex {
public static void main(String[] args) throws
InterruptedException
Runnable runA = new Runnable() {
public void run() {
//statements };
Thread ta = new Thread(runA, "threadA" );
ta.start();
}
Interface Runnable
38
Trang 39public class ex { public static void main(String[] args) throws InterruptedException {
Runnable a = new Runnable (){
@Override
public void run() {
System.out println( "AAAAA" );
} };
Runnable b = new Runnable (){
@Override
public void run() {
System.out println( "BBBBB" );
} };
Runnable c = new Runnable (){
@Override
public void run() {
System.out println( "CCCCCC" );
} };
//Tao 3 Threads ta, tb,tc Thread ta = new Thread(a, "threadA" );
Ex, multiThread
39
Trang 40 final void join() throws
làm cho thread gọi join() phải ngưng hoạt động và chờ trong một khoảng thời gian, hoặc đến khi thread này kết thúc thì mới tiếp tục hoạt động
Mean: another thread calls thrd.join(), that other thread will go
to sleep until thrd terminates If thrd is already dead when thrd.join() is called, then it simply has no e ect ff
Some methods of thread class
40
Trang 41 final void join() throws InterruptedException
Ex:
System.out.print("Running the thread ");
thrd.start();
while (thrd.isAlive()) {try { thrd.join(2000); System.out.print(".");
} catch (InterruptedException e) { } }
System.out.println(" Done!");
Some methods of thread class
41
Trang 42Some methods of thread class
42
Trang 43 static void yield() : giành lấy quyền thực thi
của tuyến đoạn hiện hành cho một trong các tuyến đoạn khác (sleep)
static int activeCount() : trả về số thread
đang active.
static void sleep() : đưa tiến đoạn hiện
hành vào trạng thái nghỉ tối thiểu là ms (milis)
Some methods of thread class
43
Trang 44 Hiện thị giá trị number giảm dần: 100->1 (extend: Hình ảnh đồng hồ đếm ngược)
MultiThread trong Applet - ex
44
Trang 45Consider a simple class called Counter class Counter {
private int c = 0;
public void increment() { c++;
} public void decrement() { c ;
} public int value() { return c;
} }
Synchronization
45
Trang 46 The single expression c++ can be
Retrieve the current value of c.
Increment the retrieved value by 1.
Store the incremented value back in c.
Ex, Thread A invokes increment at about the same time Thread B invokes decrement If the initial value of c is 0,
Thread A: Retrieve c.
Thread B: Retrieve c.
Thread A: Increment retrieved value; result is 1.
Thread B: Decrement retrieved value; result is -1.
Thread A: Store result in c; c is now 1.
Thread B: Store result in c; c is now -1.
Synchronization
46
Trang 47 Khi làm việc với nhiều Thread, có thể có một số Thread muốn sử dụng cùng tài nguyên tại cùng 1 time.
Khi hai tuyến đoạn cần sử dụng cùng một đối tượng, có
một khả năng có các thao tác đan xen nhau làm phá hỏng
dữ liệu => Race condition ex,
Tại một time t chỉ có 1 thread sử dụng tài nguyên.
Monitor: Chỉ có 1 Thread có được monitor tại 1 time Các
Thread khác muốn có được monitor phải chờ đợi
Synchronization
47
Trang 48 Sử dụng phương thức chiếm dụng đối tượng:
Nếu một đối tượng bị phong tỏa (used) bởi một tuyến đoạn nào đó thì chỉ có tuyến đoạn đó mới được truy cập tới đối tượng.
Nếu một tuyến đoạn kích hoạt một phương thức synchronized trên một đối tượng, đối tượng đó sẽ bị chiếm dụng bởi tuyến đoạn kích hoạt
Khi đối tượng được giải phóng, một tuyến đoạn khác mới được kích hoạt synchronized trên cùng đối tượng
synchronized(Obj);
Note that constructors cannot be synchronized
Method synchronized()
48
Trang 49Consider a simple class called Counter class Counter {
} }
Ex, TestUnsyn.java
49
Trang 50 Lệnh synchronized cho phép đồng bộ hóa một đối tượng thay cho phương thức
synchronized
synchronized (expr) {
//this code will execute in one thread at//a time and someObject will be locked
}
Lệnh synchronized
50
Trang 51synchronized (color) {
int myColorInt = color.getRGB();
//may be another thread invoke color.set()
String myColorName = color.getName(); }
}
Trang 52 Cơ chế chiếm dụng đồng bộ hóa ngăn cho các tuyến đoạn chồng chéo nhau
Các tuyến đoạn vẫn có thể trao đổi thông tin với nhau, sử dụng các phương thức:
wait() : cho phép một tuyến đoạn đợi cho tới khi một
điều kiện nào đó xảy ra
notify() : báo cho các tuyến đoạn biết sự kiện nào đó
Trang 53 public final void wait(long timeout) throws InterruptedException:
Tuyến đoạn hiện thời chờ cho tới khi được cảnh báo hoặc một khoảng thời gian timeout nhất định
Nếu timeout bằng 0 thì phương thức sẽ chỉ chờ cho tới khi có
cảnh báo về sự kiện
public final void notify()
Cảnh báo ít nhất một tuyến đoạn đang chờ một điều kiện nào đó thay đổi trước khi có thể gọi phương thức wait nào đó
public final void notifyAll()
Cảnh báo tất cả các tuyến đoạn đang chờ một điều kiện thay đổi
Trong số các tuyến đoạn đã được cảnh báo, tuyến đoạn nào có
độ ưu tiên cao nhất thì sẽ chạy trước tiên.
Methods: wait , notify
53
Trang 5454
Trang 55public class Wait_Noti extends Thread {
public static void main(String args[]) throws
Exception {
Thread notiThread = new Wait_Noti();
notiThread.start(); // cont to run() // wait thread an event execute
synchronized (notiThread)
{ notiThread.wait(7000);
} // wait() is done
System.out.println ("The wait is over");
}
Ex: wait , notify
55
public void run() {
System.out.println (" Click enter to stop
}
}
Trang 56 Bài toán Producer – Consumer.
set(i)
Ex: Synchonized with wait, notify
56
Trang 57public class Synch_ex { public class Product { private int view = 0;
public boolean isRemainingview;
public int get() {
//print onto screen
System.out.println("\tConsumer get " + this.view);
return view; } public void set(int piview) { this.view = piview;
System.out.println(“Producer set" + this.view);
} } //end class Product
public class Producer extends Thread { private Product sp;
Ex, Non Synchnozied
57
Trang 58public class Consumer extends Thread { private Product sp;
public static void main(String[] args) {
Synch_ex t = new Synch_ex ();
Product s = t.new Product();
//2 thread cung dung chung doi tuong s thuoc class Product
Producer p = t.new Producer(s);
Cosumer c = t.new Consumer(s);
Trang 59public synchronized int get() { while(isRemainingContents == false) { try {
wait();
} catch (InterruptedException e) {
} }
public synchronized void set(int piview ) {
while(isRemainingContents == true) { try {
wait();
} catch (InterruptedException e) {
} }
59
Trang 60 Java gán cho mỗi tuyến đoạn một độ ưu tiên để xác định cách tuyến đoạn đó được xử lý như thế nào so với các tuyến đoạn khác
Mỗi thread mới thừa kế quyền ưu tiên mà thread đã tạo ra nó.
A thread with a greater priority value will be run in preference to a thread with a smaller priority
Hằng số:
public static final int MIN_PRIORITY = 1;
public static final int NORM_PRIORITY = 5;
public static final int MAX_PRIORITY = 10;
Thread PRIORITY
60