Upload
anh-hieu
View
220
Download
0
Embed Size (px)
Citation preview
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 1/48
1
Ch ng 11: L p trình MultiThreadCh ng 11: L p trình MultiThread
GVLT: Tr n Anh D ng
L p trình h ng i t ngL p trình h ng i t ng
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 2/48
2
N i dungN i dung
a nhi m và a tuy nT o l p và s d ng tuy n
} L p Thread} Giao ti p Runnable
ng b hoá các tuy nTuy n maNhóm tuy nBài t p
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 3/48
3
a nhi m (multitasking)a nhi m (multitasking)
a nhi m là k thu t cho phép nhi u công vi c cth c hi n cùng m t lúc trên máy tính.N u có nhi u CPU, các công vi c có th c th c hi n
song song trên t ng CPU. Trong tr ng h p nhi u côngvi c cùng chia s m t CPU, t ng ph n c a m i côngvi c s c CPU th c hi n xen k .
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 4/48
4
H ai k thu t a nhi m c b n:} a ti n trình (Process-based multitasking):
Nhi u ch ng trình ch y ng th i. M ich ng trình có m t vùng d li u c l p.
} a tuy n (Thread-based multitasking): M tch ng trình có nhi u tuy n cùng ch y ngth i. Các tuy n dùng chung vùng d li u c ach ng trình.
a nhi m (multitasking)a nhi m (multitasking)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 5/48
5
Tuy n và a tuy nTuy n và a tuy n
Tuy n là m ch thi hành c l p c a m t tác vtrong ch ng trình.M t ch ng trình có nhi u tuy n th c hi n cùnglúc g i là a tuy n.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 6/48
6
T o tuy nT o tuy n
Tuy n trong Java c ng là các i t ng.Có hai cách t o tuy n
} Th a k t l p java.lang.Thread} Cài t giao ti p java.lang.Runnable
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 7/48
7
T o tuy nT o tuy n -- Cách 1: K th a t ThreadCách 1: K th a t Thread
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 8/48
8
K hi m t tuy n c t o ra, nó c n g i start() t tuy n tr ng thái s n sàng. Ti p theo h
th ng s th c thi các câu l nh trong run() c atuy n ó.Tuy n s k t thúc khi làm h t l nh trong run()ho c khi stop() c g i.
T o tuy nT o tuy n -- Cách 1: K th a t ThreadCách 1: K th a t Thread
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 9/48
9
T o tuy nT o tuy n -- Cách 1: K th a t ThreadCách 1: K th a t Thread
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 10/48
10
T o tuy nT o tuy n -- Cách 2: Cài t RunnableCách 2: Cài t Runnable
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 11/48
11
u tiênu tiên
Các tuy n trong Java có u tiênt Thread.MIN_PRIORITY (giá tr 1) nThread.MAX_PRIORITY (giá tr 10)Tuy n có u tiên càng cao thì càng s m
c th c hi n và hoàn thành. u tiên m c nh c a các tuy n là
Thread.NORM_PRIORITY (giá tr 5 ).M t tuy n m i s th a k u tiên t tuy nt o ra nó.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 12/48
12
B l p l chB l p l ch
B l p l ch (scheduler) c a Java qu n lý các tuy ntheo c ch phân chia th i gian (timeslicing).T ng tuy n s c c p m t kho ng th i gian ng n
(time quantum) s d ng CPU.Trong khi th c thi, n u ã h t th i gian c c p thìdù ch a k t thúc tuy n c ng ph i t m d ng cho
các tuy n khác cùng u tiên dùng CPU.Các tuy n cùng u tiên luân phiên s d ng CPUtheo ki u xoay vòng (round-robin).
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 13/48
13
V í d : Tuy n A và B s luânphiên nhau th c thi cho n khik t thúc. Ti p theo tuy n C sth c thi n khi k t thúc.
Ti p theo tuy n D, E và F sluân phiên th c thi n khi k tthúc. Ti p theo tuy n G th c thi
n khi k t thúc. Cu i cùngtuy n H và I luân phiên th c thi
n khi k t thúc.Nh n xét:Các tuy n có utiên th p s có nguy c b trìhoãn vô h n nh.
B l p l chB l p l ch
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 14/48
14
Ví d v a tuy nVí d v a tuy n
T o ra 3 tuy n v i u tiên m c nh.Công vi c c a m i tuy n là ng trong m t th igian ng u nhiên t 0 n5 giây. Sau khi ngxong, các tuy n s thông báo ra màn hình.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 15/48
15
class PrintThread extends Thread {private int sleepTime;public PrintThread( String name ){
super ( name );sleepTime = (int )(Math.random()*5000);System.out.println( getName() +
" have sleep time: " + sleepTime);}
Ví d v a tuy n (tt)Ví d v a tuy n (tt)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 16/48
16
// method run is the code to be executed by new threadpublic void run(){
try {System.out.println(getName()+´ starts to sleep");
Thread.sleep( sleepTime );}// sleep() may throw an InterruptedExceptioncatch (InterruptedException e){
e.printStackTrace();}System.out.println( getName() + " done sleeping" );
}
}
Ví d v a tuy n (tt)Ví d v a tuy n (tt)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 17/48
17
public class ThreadTest{public static void main( String [ ] args ){
PrintThread thread1 = new PrintThread( "thread1" );PrintThread thread2 = new PrintThread( "thread2" );PrintThread thread3 = new PrintThread( "thread3" );System.out.println( "Starting threads" );thread1.start(); // start and ready to runthread2.start(); // start and ready to runthread3.start(); // start and ready to runSystem.out.println( "Threads started, main ends\n" );
}}
Ví d v a tuy n (tt)Ví d v a tuy n (tt)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 18/48
18
Ví d v a tuy n (tt)Ví d v a tuy n (tt)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 19/48
19
M t s ph ng th c c a ThreadM t s ph ng th c c a Thread
void sleep(long millis); // ngvoid yield(); // nh ng i u khi nvoid interrupt(); // ng t tuy nvoid join(); // yêu c u ch k t thúcvoid suspend(); // deprecated
void resume(); // deprecatedvoid stop(); // deprecated
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 20/48
20
Vòng i c a tuy nVòng i c a tuy n
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 21/48
21
ng b hóa tuy nng b hóa tuy n
V i c các tuy n trong ch ng trình cùng truy nh pvào m t i t ng có th s em l i k t qu khôngnh mong mu n. V í d : Tuy n A c p nh t i t ng
X và tuy n B c d li u t X. R t có th x y ra sc là tuy n B c d li u ch a c c p nh t.ng b hoá tuy n (thread synchronization) giúp
cho t i m i th i i m ch có m t tuy n có th truynh p vào i t ng còn các tuy n khác ph i i.V íd : Trong khi tuy n A c p nh t X thì tuy n B ch a
c c.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 22/48
22
ng b hóa tuy nng b hóa tuy n
Dùng t khoá synchronized trên các ph ngth c th c hi n ng b hoá.
i t ng khai báo ph ng th c synchronized
s có m t b giám sát (monitor). B giám sátm b o t i m i th i i m ch có m t tuy nc g i ph ng th c synchronized.
K hi m t tuy n g i ph ng th c synchronized,i t ng s b khoá.K hi tuy n ó th c hi n
xong ph ng th c, i t ng s c mkhoá.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 23/48
23
ng b hóa Threadng b hóa Thread
Trong khi th c thi ph ng th c synchronized,m t tuy n có th g i wait() chuy n sang tr ngthái ch cho n khi m t i u ki n nào ó x y
ra.K
hi tuy n ang ch , i t ng s không bkhoá.K hi th c hi n xong công vi c trên i t ng,m t tuy n c ng có th thông báo (notify) cho cáctuy n khác ang ch truy nh p i t ng.Deadlock: Tuy n A ch tuy n B và tuy n B c ngch tuy n A.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 24/48
24
Q uan h Producer Q uan h Producer- -Consumer Consumer
Gi s có 2 tuy n: Producer ghi d li u vào m tbuffer và Consumer c d li u t buffer => C n có s ng b hoá n u không d li u cóth b Producer ghi è tr c khi Consumer c
c ho c Consumer có th c m t d li unhi u l n khi Producer ch a s n xu t k p.
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 25/48
25
Gi i pháp ng b hoá:} Tr c khi ti p t c sinh d li u và a vào buffer,
Producer ph i ch (wait) Consumer c xong d li ut buffer.
} K hi Consumer c xong d li u, nó s thông báo(notify) cho Producer bi t ti p t c sinh d li u.
} N u Consumer th y trong buffer không có d li uho c d li u ó ã c c r i, nó s ch (wait) chot i khi nh n c thông báo có d li u mi.
} K hi Producer s n xu t xong d li u, nó thông báo(notify) cho Consumer bi t.
Q uan h Producer Q uan h Producer- -Consumer Consumer
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 26/48
26
Ví d v PVí d v P--C: Không ng bC: Không ng b
class Buffer{private int buffer = -1;public void set( int value ){
buffer = value;}public int get(){
return buffer;}}
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 27/48
27
class Producer extends Thread{
private Buffer sharedBuffer;public Producer( Buffer shared ){
super ( "Producer" );sharedBuffer = shared;
}
Ví d v PVí d v P--C: Không ng bC: Không ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 28/48
28
public void run(){for ( int count = 1; count <= 5; count++ ){
try {Thread.sleep(( int)(Math.random() * 3000));
sharedBuffer.set( count );System.out.println( "Producer writes " + count);}catch (InterruptedException e){
e.printStackTrace();}
}System.out.println( getName() + " finished.");
}}
Ví d v PVí d v P--C: Không ng bC: Không ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 29/48
29
class Consumer extends Thread{
private Buffer sharedBuffer;public Consumer( Buffer shared ){
super ( "Consumer" );sharedBuffer = shared;
}
Ví d v PVí d v P--C: Không ng bC: Không ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 30/48
3 0
public void run(){for ( int count = 1; count <= 5; count++ ){
try {Thread.sleep(( int)(Math.random() *3000));
System.out.println( "Consumer reads " +sharedBuffer.get());}catch (InterruptedException e){
e.printStackTrace();}
}System.out.println( getName() + " finished.");
}}
Ví d v PVí d v P--C: Không ng bC: Không ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 31/48
3 1
public class SharedBufferTest1{public static void main( String [] args ){
// create shared object used by threadsBuffer sharedBuffer = new Buffer();// create producer and consumer objectsProducer producer= new Producer(sharedBuffer);Consumer consumer=new Consumer(sharedBuffer);
producer.start();//
start producer threadconsumer.start(); // start consumer thread}
}
Ví d v PVí d v P--C: Không ng bC: Không ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 32/48
3 2
K t qu khi không ng bK t qu khi không ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 33/48
33
Ví d v PVí d v P--C: Có ng bC: Có ng b
class Buffer{ // Thi t k l i l p Bufferprivate int buffer = -1;private boolean writable = true ;public synchronized void set( int value ){
while (!writable){try {
wait();}catch (InterruptedException e){
e.printStackTrace();}
}buffer = value;writable = false ;notify ();
}
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 34/48
34
public synchronized int get(){while( writable ){
try {wait();
} catch (InterruptedException e){e.printStackTrace();
}}
writable = true ;notify ();return buffer;
}
}
Ví d v PVí d v P--C: Có ng bC: Có ng b
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 35/48
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 36/48
3 6
T o tuy n t giao ti p RunnableT o tuy n t giao ti p Runnable
M t l p có th tr thành m t tuy n khi cài tgiao ti p Runnable (giao ti p này ch có m tph ng th c run() duy nh t).V í d : T o applet có qu bóng ch y
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 37/48
3 7
import java.awt.*;import java.applet.*;public class BallFlyingextendsApplet implements Runnable{
Thread animThread = null;int ballX= 0, ballY=50;int dx=1, dy=2;boolean stopRun = false ;public void start(){ // applet starts
if (animThread == null){animThread= new Thread( this );animThread.start();
}
}
T o tuy n t giao ti p RunnableT o tuy n t giao ti p Runnable
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 38/48
3 8
public void stop(){ // applet stopsstopRun = true ;}publicvoid run(){
this.setBackground(Color.CYAN);while (! stopRun){
moveBall();delay(5);
}}private void delay(intmiliSeconds){
try { Thread.sleep(miliSeconds);}catch (Exception e){
System.out.println("Sleeperror !");}
}
T o tuy n t giao ti p RunnableT o tuy n t giao ti p Runnable
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 39/48
3 9
private void moveBall(){ballX += dx;ballY += dy;if (ballY> getSize().height -30) dy =- dy;
if (ballX> getSize().width -30) dx =- dx;if (ballY< 0) dy =- dy;if (ballX< 0) dx =- dx;repaint();
}publicvoid paint(Graphicsg){
g.fillOval(ballX,ballY, 30, 30);}
}
T o tuy n t giao ti p RunnableT o tuy n t giao ti p Runnable
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 40/48
4 0
Tuy n ma th ng là tuy n h tr môi tr ng th cthi c a các tuy n khác.V í d : garbage collector c aJava là m t tuy n ma.
Ch ng trình k t thúc khi t t c các tuy n khôngph i tuy n ma k t thúc.Các ph ng th c v i tuy n ma:
} void setDaemon(boolean isDaemon); // t tuy ntr thành tuy n ma
} boolean isDaemon(); // ki m tra tuy n có ph ituy n ma không
Tuy n ma (daemon thread)Tuy n ma (daemon thread)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 41/48
4 1
Các tuy n có th c a vào trong cùng m tnhóm thông qua l p ThreadGroup. V í d : nhómtuy n tìm ki m d li u trên các t p d li u khác
nhau.M t nhóm tuy n ch có th x lý trên các tuy ntrong nhóm, ví d : ng t t t c các tuy n.Có th t o ra các nhóm tuy n là nhóm con c am t nhóm tuy n khác.Nhóm tuy n c bi t: system, main
Nhóm tuy n (thread group)Nhóm tuy n (thread group)
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 42/48
4 2
H ai l p liên quan t i x lý công vi c theo th igian:
} javax.swing.Timer } java.util.Timer
L p java.swing.Timer } n gi n, d dùng trên GUI
L p java.util.Timer } Nhi u tính n ng h n java.swing.Timer
L p Timer L p Timer
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 43/48
43
import java.awt.*;import java.awt.event.*;import java.applet.Applet;public class CountDownextends Applet implements
ActionListener{private TextField timeField;private Button startButton;private Button stopButton;
private javax.swing.Timer timer;private int count;public void init(){
timeField = new TextField(6);
Ví d : m ng cVí d : m ng c
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 44/48
44
timeField.setFont (new Font("sansserif", Font.PLAIN, 18));startButton = new Button("Start");stopButton = new Button("Stop");add(timeField);add(startButton);add(stopButton);startButton.addActionListener( this );stopButton.addActionListener( this );timer = new javax.swing.Timer(10, this );count = 0;
} // end init()
Ví d : m ng cVí d : m ng c
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 45/48
4 5
public void actionPerformed(ActionEvent e){if (e.getSource() == startButton)timer.start();
else if (e.getSource() == stopButton)timer.stop();
else {count++;int hsecond = count%100;int totalSecond = (count / 100);int h = totalSecond / 3600;int secondLeft = totalSecond%3600;
int m = secondLeft / 60;int s = secondLeft%60;timeField.setText("´ + h + ":" + m + ":" + s + ":" + hsecond);
}}
}
Ví d : m ng cVí d : m ng c
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 46/48
4 6
1. S d ng k thu t khung hình ph c i ti nch ng trình v bóng.
2. M r ng ch ng trình v bóng cho phép haiqu bóng cùng ch y trên màn hình v i t c khác nhau (Xem l i bài v Graphics).
3 . M r ng ch ng trình v bóng cho phép
trong khi bóng ch y, n u ng i dùng clickchu t vào m t v trí nào ó trên màn hình thìbóng s c chuy n ra v trí ó.
Bài t pBài t p
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 47/48
4 7
4 . V i t ch ng trình t o 2 tuy n: m t tuy n tìmki m các s nguyên t t 1000 n 1000000và m t tuy n tính t ng giá tr c a các s
nguyên t tìm c. Chú ý ng b tuy n.5 . V i t ch ng trình t o m ng có 1000000 ph n
t , sau ó t o 2 tuy n s p x p 2 n a m ng,
cu i cùng ghép 2 m ng ã s p x p. So sánhcách làm trên v i cách s p x p tr c ti p toànb m ng.
Bài t pBài t p
8/7/2019 Chuong111.LaptrinhMultiThreading-New
http://slidepdf.com/reader/full/chuong111laptrinhmultithreading-new 48/48
4 8