Ch13 執行緒(I) 物件導向系統實務.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
Java 2实用教程(第3版)教学课件 主讲教师:张国平
讓你的程式具有多工(Multitasking) 及多重處理(Multiprocessing)的能力
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
第五章 字符串.
視窗程式設計 2. 視窗版面配置 Chih Hung Wang Reference:
Ch09 繪圖與多媒體 物件導向系統實務.
第11章 Java多媒体技术.
第三部分 Java语言编程应用篇 第6章 Java语言的 图形用户界面开发技术 (之二).
第二章 JAVA语言基础.
Ch07 介面與多重繼承 物件導向程式設計(II).
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
第三章 控制结构.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch02 視窗Swing套件 物件導向系統實務.
Ch08 巢狀類別 物件導向程式設計(II).
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
2018/11/15 面向对象与多线程综合实验-GUI设计 教师:段鹏飞.
Ch07 Java Applets 物件導向系統實務.
Java语言程序设计 第七部分 多线程.
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
Multithread 多執行緒 I/O Lecturer:楊昌樺.
C#程序设计 c# programming 多线程 C#程序设计课程组.
客戶端的檔案上傳 HtmlInputFile檔案控制項 上傳單一檔案 同時上傳多個檔案.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
CH09 套件 物件導向程式設計(II).
記事本 物件導向系統實務.
類別(class) 類別class與物件object.
讓你的程式具有「多工」 及「平行處理」的能力
第10章 Java的线程处理 10.1 线程的基本概念 10.2 线程的属性 10.3 线程组 10.4 多线程程序的开发.
Java语言程序设计 第八部分 Applet小程序.
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
精彩Java 2程式設計 <吳逸賢、吳目誠 編著>
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Ch04 事件處理 物件導向系統實務.
CH03 為自己的視窗加上小元件 物件導向系統實務.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
CH04 視窗中元件排排坐 物件導向系統實務.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
Multithread 多執行緒 以GUI為例了解物件以及Event
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第二章 Java基本语法 讲师:复凡.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
Chapter 4 Multi-Threads (多執行緒).
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
Summary
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

Ch13 執行緒(I) 物件導向系統實務

本章大綱 本章內容包含課本第16章(電子書): 行程與執行緒 Thread類別 Runnable介面 執行緒的狀態 執行緒控制 執行緒的優先權 多執行緒的同步 執行緒群組

多工與多執行緒 目前的作業系統都強調「多工」(Multitasking)。例如:微軟的Windows作業系統屬於一套多工的作業系統,可以同時執行小畫家、記事本和小算盤等多個應用程式。 不同於作業系統的多工,「多執行緒」(Multithreaded)是指在單一應用程式擁有多個執行流程。例如:Web瀏覽程式可以在下載網頁檔案的同時顯示動畫、播放音樂或捲動視窗瀏覽網頁內容。

何謂多工-行程(process) 在OS中,正在執行的應用程式為一個行程 多個行程使用單一CPU

Java的執行緒-說明 「執行緒」(Thread)也稱為「輕量行程」(Lightweight Process),其執行過程類似上述程式執行,只是執行緒不能單獨存在或執行,一定需要隸屬於一個程式,由程式啟動執行緒,如右圖所示:

Java的執行緒-多執行緒 如果程式碼本身沒有先後依存關係(例如:沒有共用同一個陣列或變數),程式能夠分割成多個同步執行緒來一起執行,這種程式設計方法稱為「平行程式設計」(Parallel Programming),如右圖所示:

執行緒的優點 多行程多執行緒使用單一CPU

執行緒的優點 不同的行程所佔有的記憶體資源不同,各自獨立互不干擾。 大部份的個人電腦只有一個CPU,所有行程都必須透過系統取得CPU的使用權。 每個行程輪流使用CPU的情形就像是每個行程都同時執行一樣。 執行緒是行程中的子程式,這些子程式共享行程內的資源,同時時可分配CPU的使用權,以提高CPU使用率

JAVA的執行緒說明 main()其實就是Java應用程式的預設執行緒(或稱主執行緒,Main Thread)。 多執行緒程式必須靠主執行緒去啟動其它執行緒的進行。 Java的執行緒都必須是java.lang.Thread類別的物件。

Java執行緒的使用方法 Java執行緒是建立Thread類別的物件,一共有2種方式建立多執行緒應用程式,如下所示: 方法2:實作Runnable介面,如果你的類別已經繼承其它類別(例如:已繼承JFrame)時,可以採用此方法,利用實作介面來達成執行緒。

方法1:繼承Thread類別-架構 若類別沒有繼承其它類別,就可以直接繼承Thread類別,然後覆寫run()方法建立執行緒物件,如下所示: class UserThread extends Thread { // 建構子 public UserThread(int length, String name) { } // 執行執行緒 public void run() { ……… } }

方法1:繼承Thread類別-啟動 接著就可以建立Thread物件,啟動執行緒,如下所示: UserThread ut1 = new UserThread(5, "執行緒A"); ut1.start(); 上述程式碼在建立好UserThread物件ut1後,這是Thread物件,所以可以直接使用start()方法啟動執行緒。

Thread 類別 Thread的建構子及啟動、暫停方法 Thread之建構子及方法 說明 Thread(String name) final String getName() 取得執行緒的名稱。 static void sleep(long ms) throws InterruptedException 讓執行緒暫停ms毫秒的時間(若暫停的期間執行緒被中斷,則會丟出InterruptedException例外)。 void run() 執行緒啟動時所執行的方法。 void start() 讓執行緒啟動的方法。

Thread 類別 使用執行緒的步驟: Step 1: 先宣告一Thread的子類別,並建立一run() Step 3: 呼叫start()方法來啟動執行緒 Step 4: 在Step 3啟動時,會自動開始執行run()方     法

範例1:利用Thread來建立多執行緒(1/3) 主程式 class Ch05_01 { public static void main(String args []) MyThread05_01 t1 = new MyThread05_01("執行緒A:"); MyThread05_01 t2 = new MyThread05_01("執行緒B:"); System.out.println("開始執行執行緒..."); t1.start(); t2.start(); try { Thread.sleep((int)(Math.random()*1000)); } catch(InterruptedException e) {} System.out.println("main主執行緒結束..."); }

範例1:利用Thread來建立多執行緒(2/3) class MyThread05_01 extends Thread { //建構子 MyThread05_01(String name) { super(name); } public void run() { for(int i = 0; i<= 5; i++) { int restTime = (int)(Math.random()*1000); String s = getName() + "迴圈執行第" + i + "次! 要休息" + restTime + "毫秒!"; System.out.println(s); try { Thread.sleep(restTime); } catch(InterruptedException e) {}

範例1:利用Thread來建立多執行緒(3/3) 第1次執行結果: 第2次執行結果:

Thread 類別 欲啟動一個執行緒時,必須呼叫它的start()方法,而不是直接呼叫它的run()方法。 若直接呼叫Thread類別物件的run()方法,並不會啟動執行緒,只是一般方法的呼叫。 執行緒結束之後,執行緒物件還存在,但是不可以重新啟動。

Thread 類別 呼叫start()方法後執行緒才開始執行

方法2:Runnable介面 執行緒欲繼承Thread以外的類別時,可以利用Runnable介面建立。 Runnable介面只宣告一個run()方法,所以實作介面時只要實作run()方法即可。 實作Runnable介面的類別,還是必須依賴Thread類別的建構子才能建立一個執行緒物件。

方法2:實作Runnable介面-架構 使用時機:Swing應用程式繼承自JFrame,Java Applet繼承自JApplet,就只能實作Runnable介面的run()方法來建立多執行緒的應用程式,如下所示: class UserThread extends UserClass implements Runnable { // 建構子 public UserThread(int length) { } // 執行執行緒 public void run() { ……… } }

方法2: 實作Runnable介面-啟動 接著可以建立Thread物件和啟動執行緒,如下所示: UserThread ut1 = new UserThread(5); Thread t1 = new Thread(ut1, "執行緒A"); t1.start(); 上述程式碼在建立好UserThread物件ut1後,使用ut1物件建立Thread物件的執行緒,參數字串是執行緒名稱,最後使用start()方法啟動執行緒。

方法2: 實作Runnable介面- Thread建構子

範例2:使用Runnable介面(1/3) Ch05_02.java主程式 class Ch05_02 { public static void main(String args []) MyRunnable05_02 r1 = new MyRunnable05_02(); MyRunnable05_02 r2 = new MyRunnable05_02(); Thread t1 = new Thread(r1, "執行緒A"); Thread t2 = new Thread(r2, "執行緒B"); System.out.println("開始執行執行緒..."); t1.start(); t2.start(); try { Thread.sleep((int)(Math.random()*1000)); } catch(InterruptedException e) {} System.out.println("main主執行緒結束..."); }

範例2:使用Runnable介面(2/3) 繼承Runnable介面的自訂類別 class MyRunnable05_02 implements Runnable { public void run() for(int i = 0; i<= 5; i++) int restTime = (int)(Math.random()*1000); String s = Thread.currentThread().getName() + "迴圈執行第" + i + "次! 要休息" + restTime + "毫秒!"; System.out.println(s); try { Thread.sleep(restTime); } catch(InterruptedException e) {} }

範例2:使用Runnable介面(3/3) 第一次執行結果 第二次行結果

練習一 二個執行緒,第一個執行緒每隔200毫秒列出一偶數;第二個執行緒每隔300毫秒列出一3的倍數,直到二個執行緒列出所有小於100的數 程式Q12_1.java

範例3:跑馬燈Applet+Thread(1/2) public void start() { thread = new Thread(this); thread.start(); } public void run() { while(true) { scrollStatus(); try { Thread.sleep(50); } catch(InterruptedException e) { break; } public void scrollStatus() { int length = msg.length(); int index = pos; for( int i = 0; i< width; i++) if (index >= length) statusBuf.setCharAt(i, ' '); else statusBuf.setCharAt(i, msg.charAt(index)); index++; getAppletContext().showStatus(statusBuf.toString()); pos++; if(pos >= length) pos = 0; Ch05_03.java import javax.swing.*; import java.util.*; public class Ch05_03 extends JApplet implements Runnable { Thread thread; String msg; StringBuffer statusBuf; int pos; int width; public void init() msg = getParameter("message"); width = Integer.valueOf(getParameter("width")).intValue(); pos = 0; statusBuf = new StringBuffer(width); statusBuf.setLength(width); int length = msg.length(); char buffer [] = new char[width]; for(int i = 0; i < width; i++) buffer[i] = ' '; msg.getChars(0, length, buffer, (width-length) / 2); msg = new String(buffer); }

範例3:跑馬燈Applet+Thread(2/2) Ch05_03.htm <html> <head> <title> </title> </head> <body> <applet code="Ch05_03.class" width=0 height=0> <param name="message" value="歡迎光臨我的網站!"> <param name="width" value="100"> </applet> </body> </html>

範例4:在JFrame上顯示動畫(1/3) /* 程式範例 */ import javax.swing.*; import java.awt.*; import java.awt.event.*; // 繼承JFrame類別, 實作ActionListener介面 public class Ch05_05 extends JFrame implements ActionListener { private int offset = -10; private Timer timer; private AnimationPane animationPane; // 建構子 public Ch05_05() { super("動畫功能的顯示範例"); int delay = 100; timer = new Timer(delay, this); timer.setInitialDelay(0); Container c = getContentPane(); c.setLayout(new FlowLayout()); c.setBackground(Color.gray); Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image = toolkit.getImage("bleye.gif"); animationPane = new AnimationPane(image); c.add(animationPane); timer.start(); }

範例4:在JFrame上顯示動畫(2/3) // 顯示動畫的JPanel class AnimationPane extends JPanel { Image image; // 建構子 public AnimationPane(Image image) { setPreferredSize(new Dimension(250, 100)); setBackground(Color.lightGray); this.image = image; } public void paintComponent(Graphics g) { super.paintComponent(g); int width = getWidth(); int height = getHeight(); // 計算圖片的尺寸 int imgWidth = image.getWidth(this); int imgHeight = image.getHeight(this); g.drawImage(image,((offset*5)%(imgWidth+width)) - imgWidth, (height-imgHeight)/2, this);

範例4:在JFrame上顯示動畫(3/3) // 實作事件處理方法 public void actionPerformed(ActionEvent evt) { offset++; animationPane.repaint(); // 重繪 } // 主程式 public static void main(String[] args) { // 建立Swing應用程式 Ch05_05 app = new Ch05_05(); // 關閉視窗事件, 結束程式的執行 app.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); app.setSize(300, 150); // 設定尺寸 app.setVisible(true); // 顯示視窗

期末考 作一個賽馬遊戲,玩者可以選擇一次要押多少籌碼,選一匹馬,如果獲勝,可以得到更多籌碼 每次比賽有五匹馬