Presentation is loading. Please wait.

Presentation is loading. Please wait.

Multithread 多執行緒 以GUI為例了解物件以及Event

Similar presentations


Presentation on theme: "Multithread 多執行緒 以GUI為例了解物件以及Event"— Presentation transcript:

1 Multithread 多執行緒 以GUI為例了解物件以及Event
Lecturer:楊昌樺

2 Important Features of Java
何謂多工 (Multi-tasking) 例如,撰寫網路程式,模擬程式。 Java 利用 “執行緒” (Thread) 來實作多工 可將一個Process分成數份, 讓各部份能同時被執行。

3 Process and Thread Process - 正在執行的應用程式 不同的行程會對應到不同的
系統資源 CPU時間 Multithread的概念特別針對CPU時間的分配 暫時閒置的CPU時間,用在執行應用程式的其他工作上 語法不難,難在掌控 執行先後順序 資源維護

4 執行緒的生命週期 Blocked start() Runnable Running yield()
notify(), I/O unblock sleep(), wait(), , I/O block start() Runnable Running yield()

5 設計背景 雖然說一次可以處理多個執行緒 不過在同一個時間點真正執行的還是只有一個 (例外:多CPU系統可以執行多個) 處理多個執行緒時
一次只有一個執行緒在執行(Running) 其他執行緒在Runnable區塊中等待 執行先後順序會依照執行緒的優先權來判定 沒執行的在Runnable區塊中等待下一次優先權的判定

6 Thread類別 java.lang.Thread 提供的基本方法
public class Thread extends Object implements Runnable 提供的基本方法 static yield() 讓目前running的暫停, 讓runnable的擇一跑 static sleep() 讓目前running的睡一個設定的時間 start() 啟動, 之後JVM可啟動該thread的run() setPriority() setPriority(MAX_PRIORITY):給最大優先權 setPriority(MIN_PRIORITY):給最小優先權 setPriority(NORM_PRIORITY):預設的優先權

7 簡單程式範例 (MyThread.java)
public class MyThread extends Thread{ MyThread(String n) { super(n); } public void run() String tname = super.getName(); try for(int i = 1; i<=5000;i++) System.out.println(tname+" "+i+" "+Math.random()); catch(Exception e) System.out.println("error"); class TestThread { public static void main(String[] args) MyThread t1 = new MyThread("t1"); MyThread t2 = new MyThread("t2"); t1.start(); t2.start(); } thread t1, t2 各執行5000次迴圈,在各個電腦產生的執行順序也會因為各個電腦當時的CPU效能而有所不同

8 說明 新的執行緒物件(new MyThread) 經由start()方法進入Runnable 區準備執行
排程後將選出來的執行緒丟入Running區執行 此時會觸發執行緒run()方法,執行實作內容(寫在run()內的程式碼) 若執行緒未執行完成(例如取得的CPU時間已到卻還沒完成工作,或是程式呼叫了特定的方法) ,或是執行wait(),將會觸發Blocking event並進入Blocked區 被封鎖的執行緒解除封鎖(Unblocked)或者是或別的程式中呼叫了notify()方法之後,將再進入Runnable pool中等待下一次執行 若程式中呼叫了yield()方法(讓與),則是將執行權先給其他執行緒執行,不過其本身仍然還是在Runnable中

9 不能多重繼承時 (MyThread2.java)
public class MyThread2 implements Runnable { int i; public void run() i = 0; while (true) System.out.println(Thread.currentThread().getName() + " " + (++i) + " " +Math.random()); if ( i == 5000 ) break; } class TestThread2 { public static void main(String args[]) MyThread2 r = new MyThread2(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.setName(“t1"); t2.setName(“t2"); t1.start(); t2.start(); } 先宣告一個空的MyThread2類別物件r 建立t1, t2 執行緒物件實體,其對象為 MyThread2中的run()方法

10 如果執行緒間彼此有同步的考量 (MyThread3.java)
public class MyThread3 implements Runnable{ static int max=0; public void run() { for(int i = 1; i<=5000;i++) int tmp=max; System.out.println( Thread.currentThread().getName() + " " + ++tmp ); max=tmp; } class TestThread3 { public static void main(String args[]) MyThread3 r = new MyThread3(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } 各把max拿來加5000次 最後卻不一定等於10000 而且每次都不一樣, why?

11 方法加 synchronized 保證 addMax()這個方法 只有同時間只有一個process可以執行
public class MyThread4 implements Runnable{ static int max=0; public void run() { for(int i = 1; i<=5000;i++) addMax(); } private synchronized void addMax() int tmp=max; System.out.println(Thread.currentThread().getName() + " " + ++tmp); max=tmp; 保證 addMax()這個方法 只有同時間只有一個process可以執行

12 Demo Turn 寫一個多執行緒程式,模擬三個人存同一個戶頭的錢,每次存1000圓,總共存10次 每次存完讓該Thread睡個幾毫秒
Thread.sleep((long)(Math.random()*10)); 這個方法需要處理exception,試用教過的例外處理 最後輸出的是隨機的存款出現的順序 確保最後出現的是三萬元 (可以每次顯示是誰存的,存多少,總額)

13 Event 當我們在寫程式時,多半會需要與使用者互動或回應其指令
Java 的awt 則採用event-drivenprogramming 的方法來達成此目的,當某個特定的事件發生,就會驅動程式去執行某些特定的動作,而可與使用者產生即時的互動 三個要素 Event – 意指某個特定的事件、動作,也就是「發生了什麼事件」。例如:視窗關閉、滑鼠移動。 Event Source – 產生、觸發事件的元件。例如:Button Event Handler – 負責接收Event object 並作處理的Method EventSource,產生了某個Event object ,而由Event Listener負責處理這個Event

14 Events 以物件來表示 所有的事件都是 EventObject的子類別 所有的訊息都包含在java.awt.event類別庫內

15 以GUI為例了解物件 HelloWindow.java
JFrame frame = new JFrame(“HelloWindow”); //建立視窗框架 Container cp = frame.getContentPane(); //獲得內容面板 cp.setLayout(new FlowLayout(FlowLayout.LEFT)); //設定版面配置 JTextField textA = new JTextField(20); //宣告文字元件 JButton button1 = new JButton(“hi”); //宣告按鈕元件 cp.add(textA); //將元件加入面板 cp.add(button1); //將元件加入面板 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設定關閉動作 frame.pack(); //調整視窗大小 frame.setVisible(true); //顯示視窗

16 以GUI範例了解物件以及Event 以MyGUI了解Event (MyGUI.java) 作加法
public MyGUI() //MyGUI.java { buttonPlus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int varA = Integer.parseInt(textA.getText()); int varB = Integer.parseInt(textB.getText()); Integer varC = new Integer(varA+varB); textC.setText(varC.toString()); } });

17 委派事件模型 1. 事先有註冊 按鈕 buttonPlus actionListener 3. 根據物件的種類 指派給事件處理者
2.按下按鈕產生一個 Event物件傳給actionListner 3. 根據物件的種類 指派給事件處理者 actionPerformed

18 系統實際運作狀況 當事件發生時,會有一個事件ID產生 GUI元件使用這個ID碼,呼叫對應的事件方法
假如收到有ActionEvent這種物件規格 從全部已註冊的ActionListeners中,選出欲呼叫的actionPerformed() 方法

19 另一個版本 class MyListener implements ActionListener //介面 {
public void actionPerformed(ActionEvent e) //實現這個介面一定要 { //實作actionPerformed int varA = Integer.parseInt(textA.getText()); int varB = Integer.parseInt(textB.getText()); Integer varC = new Integer(varA+varB); textC.setText(varC.toString()); } public MyGUI2() // MyGUI2.java MyListener listener = new MyListener(); // buttonPlus.addActionListener(listener);

20 Event的註冊 Event 產生時,只會通知有註冊過的Listener。所以對必須要先把Event『註冊』給要負責處理的Listner
註冊所有想要擷取的事件,而當使用者啟動的事件並不是我們所想要的事件時,就不加以理會 程式上以XX.addXXListener 來完成註冊 button.addActionListener(new ActionListener() … 一個event source 可以被好幾個listener 所註冊,同樣地,一個listener 也可以註冊好幾個event source 所有的Event Listener 都是一種interface,裡面只有定義這個Listener所提供的抽象method 必須去實作出此listener interface 內所有的method

21 事件物件說明 事件名稱 發生事件的原因 ActionEvent 按下按鈕、或是在輸入文字方塊/選擇清單方塊時按下Enter
AdjustmentEvent 移動捲軸物件時 ItemEvent 選取核取方塊、選項鈕、下拉式清單和清單方塊 TextEvent 輸入的文字內容改變 ComponentEvent 隱藏、移動、顯示和調整元件時 ContainerEvent 新增或刪除元件 FocusEvent 元件取得或失去焦點時 KeyEvent 鍵盤按下、放開和輸入字元 MouseEvent 與滑鼠有關的行為 WindowEvent 視窗的操作,包括開、關、調整大小 PaintEvent 與繪圖有關的動作 InputEvent 它是KeyEvent和MouseEvent的父抽象類別

22 ActionListener ActionListener 都是EventListener的子類別 Action Type
ComponentEvent ComponentListener FocusEvent FocusListener KeyEvent KeyListener ContainerEvent ContainerListener WindowEvent WindowListener ItemEvent ItemListener AdjustEvent AdjustListener TextEvent TextListener ActionEvent

23 處理的方法 Button CheckBox Component

24 Your Turn 實作出MyCalc小算盤 (利用MyCalc.java半成品改良) Form已經建好了 完成計算機功能 @代表 00
S取平方根 % 例如 50*10% 5


Download ppt "Multithread 多執行緒 以GUI為例了解物件以及Event"

Similar presentations


Ads by Google