Tải bản đầy đủ (.pdf) (43 trang)

chuong 4 lap trinh multithread trong java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (606.26 KB, 43 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>LẬP TRÌNH </b>

<b>ĐA LUỒNG (MULTITHREAD) TRONG JAVA </b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

Nội dung

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Lậ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ý.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

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ý.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

Giới thiệu HĐH đa nhiệm

<small></small> <b>Hệ điều hành đa nhiệm cổ điển: </b>

<small></small> Process là đoạn chương trình độc lập đã được nạp vào bộ nhớ. <small></small> Mỗi process thi hành một ứng dụng riêng.

<small></small> Mỗi process có một khơng gian địa chỉ và một không gian trạng thái riêng.

<small></small> Các process liên lạc với nhau thông qua cơ chế điều phối của HĐH.

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<small></small> <b>Hệ điều hành đa nhiệm hiện đại, hỗ trợ thread: </b>

<small></small> Thread một đoạn các câu lệnh được thi hành.

<small></small> Mỗi process có một khơng gian địa chỉ và nhiều thread

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<small></small> Luồng của một q trình có thể chia sẻ nhau khơng gian địa chỉ : Biến tồn cục, tập tin, chương trình con, . . .

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<small>Main Thread </small>

<small>Các thread có thể chuyển đổi dữ liệu với nhau </small>

Chương trình Multithread

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Ứng dụng Multithread

<small>9 </small>

<b>Printing Thread </b>

<b>Editing Thread </b>

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Lập trình multithread với Java

public class Thread extends Object { … }

public interface Runnable {

public void run(); // work  thread }

<small>+isAlive()+join()+interrupt()+start()+stop()</small>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Lớp java.lang.Thread

của lớp Thread.

<small></small>

public static synchronized void start() :

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<small></small>

public void run():

<small></small>

public void stop() : kết thúc một thread.

Lớp java.lang.Thread

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Tạ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

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Tạo thread sử dụng lớp Thread

<b> class MyThread extends Thread </b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

Ví dụ

<b> public void run() { </b>

System.out.println(" this thread is running ... "); }

} // end class MyThread

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Ví dụ

<b>class ThreadEx1 { // a program that utilizes the thread </b>

public static void main(String [] args ) {

<b> MyThread t = new MyThread(); </b>

<b> t.start(); </b>

} // end main()

} // end class ThreadEx1

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Tạo thread sử dụng Runnable

class MyThread implements Runnable { ...

public void run() {

} }

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

Tạo thread sử dụng Runnable

MyThread myObject = new MyThread();

Thread thr1 = new Thread(myObject);

thr1.start();

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

class MyThread implements Runnable { public void run() {

System.out.println(" this thread is running ... "); }

} // end class MyThread

Ví dụ

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

class ThreadEx2 {

public static void main(String [] args ) {

<b> Thread t = new Thread(new MyThread()); </b>

<b> t.start(); </b>

} // end main()

} // end class ThreadEx2

Ví dụ

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Threads – Thread States

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Vòng đời của thread

time slice

notify, notifyAll, IO complete, sleep expired,

join complete

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<small></small> <b>Viết chương trình thi hành song song 3 thread </b>

class A extends Thread { public void run() {

Ví dụ

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

class B extends Thread { public void run() {

Ví dụ

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

class C extends Thread { public void run() {

Ví dụ

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

class ThreadTest {

public static void main(String args[]) { new A().start();

new B().start(); new C().start(); }

}

Ví dụ

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

Chạy lần thứ 1

<small>java ThreadTest </small>

<small> From ThreadA: i= 1 From ThreadA: i= 2 From ThreadA: i= 3 From ThreadA: i= 4 From ThreadA: i= 5 Exit from A </small>

<small> From ThreadC: k= 1 From ThreadC: k= 2 From ThreadC: k= 3 From ThreadC: k= 4 From ThreadC: k= 5 Exit from C </small>

<small> From ThreadB: j= 1 From ThreadB: j= 2 From ThreadB: j= 3 From ThreadB: j= 4 From ThreadB: j= 5 Exit from B </small>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<small>java ThreadTest </small>

<small> From ThreadA: i= 1 From ThreadA: i= 2 From ThreadA: i= 3 From ThreadA: i= 4 From ThreadA: i= 5 From ThreadC: k= 1 From ThreadC: k= 2 From ThreadC: k= 3 From ThreadC: k= 4 From ThreadC: k= 5 Exit from C </small>

<small> From ThreadB: j= 1 From ThreadB: j= 2 From ThreadB: j= 3 From ThreadB: j= 4 From ThreadB: j= 5 Exit from B </small>

<small>Exit from A </small>

Chạy lần thứ 2

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

Độ ưu tiên

của thread. Khi thread được tạo ra có độ ưu tiên mặc định (NORM_PRIORITY).

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<small>class ThreadPriority { </small>

<small> public static void main(String args[]) { A threadA=new A(); </small>

<small> B threadB=new B(); C threadC=new C(); </small>

<small> threadC.setPriority(Thread.MAX_PRIORITY); threadB.setPriority(threadA.getPriority()+1); threadA.setPriority(Thread.MIN_PRIORITY); System.out.println("Started Thread A"); </small>

<small> threadA.start(); </small>

<small> System.out.println("Started Thread B"); threadB.start(); </small>

<small> System.out.println("Started Thread C"); threadC.start(); </small>

<small> System.out.println("End of main thread"); } </small>

<small>} </small>

Ví dụ về thread priority

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

Threads – Scheduling

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

thi hành một khoảng thời gian ngẫu nhiên.

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

<b><small> 1 // ThreadTester.java </small></b>

<b><small> 2 // Show multiple threads printing at different intervals. </small></b>

<b><small> 3 </small></b>

<b><small> 4 public class ThreadTester { </small></b>

<b><small> 5 public static void main( String args[] ) </small></b>

<b><small> 6 { </small></b>

<b><small> 7 PrintThread thread1, thread2, thread3, thread4; </small></b>

<b><small> 8 </small></b>

<b><small> 9 thread1 = new PrintThread( "thread1" ); </small></b>

<b><small>10 thread2 = new PrintThread( "thread2" ); </small></b>

<b><small>11 thread3 = new PrintThread( "thread3" ); </small></b>

<b><small>12 thread4 = new PrintThread( "thread4" ); </small></b>

<b><small>25 class PrintThread extends Thread { </small></b>

<b><small>26 private int sleepTime; </small></b>

<b><small>27 </small></b>

<b><small>28 // PrintThread constructor assigns name to thread </small></b>

<b><small>29 // by calling Thread constructor </small></b>

<b><small>main </small></b><small>kết thúc khi thread cuối cùng kết thúc. </small>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<b><small>30 public PrintThread( String name ) </small></b>

<b><small>31 { </small></b>

<b><small>32 super( name ); </small></b>

<b><small>33 </small></b>

<b><small>34 // sleep between 0 and 5 seconds </small></b>

<b><small>35 sleepTime = (int) ( Math.random() * 5000 ); </small></b>

<b><small>41 // execute the thread </small></b>

<b><small>42 public void run() </small></b>

<b><small>53 // print thread name </small></b>

<b><small>54 System.err.println( getName() + " done sleeping" ); </small></b>

<b><small>55 } </small></b>

<b><small>56 } </small></b>

<small>Gọi constructor lớp cha </small>

<b><small>Sleep </small></b><small>có thể ném ra biệt lệ Công việc của thread </small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

Đồng bộ hóa

<i><small>class Parentheses { void display(String s) { System.out.print("(" + s); try { </small></i>

<i><small> Thread.sleep(1000); </small></i>

<i><small> } catch (InterruptedException e) { System.out.println("Interrupted"); } </small></i>

<i><small> System.out.println(")"); } </small></i>

<i><small>} </small></i>

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">

Đồng bộ hóa

<i><small>class MyThread implements Runnable { String str; </small></i>

<i><small> Parentheses parentTheses; Thread t; </small></i>

<i><small> public MyThread(Parentheses p, String s) { parentTheses = p; </small></i>

<i><small> str = s; </small></i>

<i><small> t = new Thread(this); t.start(); </small></i>

<i><small> } </small></i>

<i><small> public void run() { </small></i>

<i><small> parentTheses.display(str); } </small></i>

<i><small>} </small></i>

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">

<small> name1.t.join(); // tạm dừng cho đến khi thread kết thúc name2.t.join(); </small>

<small> } catch (InterruptedException e) { System.out.println("Interrupted"); } </small>

<small> } } </small>

</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43">

<i> } </i>

</div>

×