Microsoft Word - 投影片ch15

Similar documents
Microsoft Word - 投影片ch11

Chapter 9: Objects and Classes

The Embedded computing platform

Microsoft Word - 投影片ch13

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:


Microsoft PowerPoint - 14Threads.ppt

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

chp6.ppt

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

投影片 1

JavaIO.PDF

EJB-Programming-4-cn.doc

運算子多載 Operator Overloading

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

Microsoft PowerPoint - chap12.ppt

建模与图形思考

untitled

untitled

javaexample-02.pdf

Microsoft Word - JAVA Programming Language Homework VI_ans.doc

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

第3章.doc

untitled

untitled

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

Java

Chapter 9: Objects and Classes

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

《大话设计模式》第一章

投影片 1

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

untitled

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

untitled

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

2009年9月全国计算机等级考试二级Java真题及答案

chp11.ppt

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

公務員服務法第13條相關解釋彙整表

大陸教育部等6個部門公佈「現代職業教育體系建設規劃 ( 年)」規劃到2015年初步形成現代職業教育體系框架,到2020年基本建成「中國」特色現代職業教育體系

资 讯 速 递 台 基 于 大 数 据 的 学 校 督 导 评 估 系 统 建 设 上 海 市 闵 行 区 人 民 政 府 教 育 督 导 室 ( 摘 要 ) 闵 行 教 育 在 深 化 教 育 改 革 探 索 管 办 评 分 离 的 背 景 下, 把 教 育 督 导 评 估 系 统 建 设 作 为

B1

浙江师范大学2014年度毕业生就业质量报告

目 录 监 管 资 讯 2016 年 全 国 保 险 监 管 工 作 会 议 召 开...3 协 会 动 态 赤 峰 保 险 行 业 协 会 召 开 数 据 统 计 和 信 息 宣 传 总 结 表 彰 会 议...5 赤 峰 市 保 险 行 业 协 会 秘 书 处 召 开 2015 年 度 述 职

同 时, 采 取 提 供 新 闻 线 索 和 素 材 安 排 专 访 等 方 式 主 动 为 新 闻 媒 体 服 务, 为 采 访 报 道 活 动 创 造 便 利 条 件 建 设 网 络 信 息 发 布 平 台 2013 年 9 月 开 通 中 央 纪 委 监 察 部 网 站,2015 年 1 月

時間軸上的竹蓮記憶 學務主任 黃雅彙 我不是竹蓮國小的畢業校友 但對於身為新竹人的我來 說 仔細回想起來 似乎和竹蓮有著一種特別的緣分 對竹蓮國小最初的印象是在小學的時候 猶記得年幼的 我經過一段時日的啦啦隊舞蹈訓練後 老師便帶著我們從學 校步行到竹蓮國小來參加比賽 一踏入竹蓮校門 映入眼簾 的是黑

B1

Microsoft Word - 临政办发6.doc

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

1.5招募说明书(草案)

3.1 num = 3 ch = 'C' 2

The golden pins of the PCI card can be oxidized after months or years

運算子多載 Operator Overloading

目 录 一 本 科 教 育 基 本 情 况... 1 ( 一 ) 人 才 培 养 目 标... 1 ( 二 ) 专 业 设 置 情 况... 1 ( 三 ) 在 校 生 及 招 生 情 况... 2 二 师 资 队 伍 情 况... 3 ( 一 ) 教 职 工 数 量... 3 ( 二 ) 专 任

untitled

Java 1 Java String Date

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

電機工程系認可證照清單 /7/1

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc


【主持人】:给大家介绍一下,这次的培训是我们画刊部的第三次培训,当然今天特别有幸请来著吊的摄影家李少白老师给我们讲课

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

Microsoft Word - 投影片ch22

游戏攻略大全(五十六).doc

净 利 润 和 扣 除 非 经 常 性 损 益 后 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 亿 元 和 亿 元 ; 3 假 设 本 公 司 2016 年 扣 除 非 经 常 性 损 益 前 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 6

牧 者 心 聲 要 因 心 懷 平 而 作 惡 要 謹 慎 言 行 免 得 舌 頭 犯 罪 ; 惡 人 時 候 要 用 嚼 環 勒 住 口 ( 詩 三 十 九 1) 今 天 社 會 和 教 會 裏 極 其 渴 望 人 能 以 具 體 行 動 勉 勵 走 善 良 正 直 路 作 好 榜 樣 ; 可 惜

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

EJB-Programming-3.PDF


單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

全国计算机技术与软件专业技术资格(水平)考试

附录J:Eclipse教程

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

Microsoft Word - 01.DOC

VM GC HotSpot JVM Oracle OpenJDK Java JVM JVM Java Java 記憶體洩漏 memory leak Java public static void main(string args[]) { int bigarray[] = new int[10000

Microsoft Word 軟體設計第二部份範例試題_C++_ _1_.doc

Learning Java

Natural Language Processing, Topic Modeling, Neural Text Generation and Ali Xiaomi

Microsoft Word - 第6章.doc

计 算 机 系 统 应 用 年 第 25 卷 第 4 期 线 程 的 复 用 [2,3]. 通 常 情 况 下, 服 务 器 端 程 序 在 启 动 时 创 建 若 干 数 量 的 线 程 对 象 并 缓 存 起 来, 此 时 它 们 处 于

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

在 ongodb 中实现强事务

软件工程文档编制

Microsoft PowerPoint - ch02

Microsoft Word - 投影片ch12

c_cpp

Microsoft Word - ch04三校.doc

Microsoft Word - Broker.doc

Transcription:

Java2 JDK5.0 教學手冊第三版洪維恩編著博碩文化出版書號 pg20210 第十五章多執行緒 本章學習目標認識執行緒學習如何建立執行緒學習如何管理執行緒認識執行緒的同步處理

多執行緒 15-2 15.1 認識執行緒 多執行緒 的機制可以同時執行多個程式區塊 app15_1 是單一執行緒的範例 : 01 // app15_1, 單一執行緒的範例 02 class CTest 03 { 04 private String id; 05 public CTest(String str) // 建構元, 設定資料成員 id 06 { 07 id=str; 08 } 09 public void run() // run() method 10 { 11 for(int i=0;i<4;i++) 12 { 13 for(int j=0;j<100000000;j++); // 空迴圈, 用來拖慢 14 行執行的速度 14 System.out.println(id+" is running.."); 15 } 16 } 17 }

多執行緒 15-3 18 19 public class app15_1 20 { 21 public static void main(string args[]) 22 { 23 CTest dog=new CTest("doggy"); 24 CTest cat=new CTest("kitty"); 25 dog.run(); 26 cat.run(); 27 } 28 } /* app15_1 OUTPUT------- 第 25 行用 dog 物件呼叫 run() method 的執行結果 第 26 行用 cat 物件呼叫 run() method 的執行結果 -------------------------*/

多執行緒 15-4 啟動執行緒 要啟動執行緒, 必須先準備好下列兩件事情 : (1) 此類別必須是延伸自 Thread 類別, 使自己成為它的子類別 (2) 執行緒的處理必須撰寫在 run() method 內

多執行緒 15-5 要使一類別可啟動執行緒, 必須用下列的語法來撰寫 : class 類別名稱 extends Thread // 從 Thread 類別延伸出子類別 { 類別裡的資料成員 ; 類別裡的 method; 修飾子 run() // 改寫 Thread 類別裡的 run() method { 以執行緒處理的程序 ; } } 格式 15.1.1 執行緒之定義語法

多執行緒 15-6 以上述的觀念來重新撰寫 app15_1, 使它可以同時啟動多個執行緒 : 01 // app15_2, 啟動執行緒的範例 02 class CTest extends Thread // 從 Thread 類別延伸出子類別 CTest 03 { 04 private String id; 05 public CTest(String str) // 建構元, 設定成員 id 06 { 07 id=str; 08 } 09 public void run() // 改寫 Thread 類別裡的 run() method 10 { 11 for(int i=0;i<4;i++) 12 { 13 for(int j=0;j<100000000;j++);// 空迴圈, 用來拖慢 14 行執行的速度 14 System.out.println(id+" is running.."); 15 } 16 } 17 } 18 19 public class app15_2 20 { 21 public static void main(string args[])

多執行緒 15-7 22 { 23 CTest dog=new CTest("doggy"); 24 CTest cat=new CTest("kitty"); 25 dog.start(); // 注意是呼叫 start(), 而不是 run() 26 cat.start(); // 注意是呼叫 start(), 而不是 run() 27 } 28 } /* app15_2 OUTPUT------- 第 26 行用 cat 物件呼叫 start() method 第 25 行用 dog 物件呼叫 start() method -------------------------*/

多執行緒 15-8 下圖為單一執行緒與兩個執行緒的執行流程比較 : 單一執行緒 兩個執行緒 dog.run() cat.run() dog.start() cat.start() app15_1.java 執行完 dog.run() 之後, 再執行 cat.run() app15_2.java 由 start() 啟動執行緖, 因而 dog 和 cat 物件的 run() 會同時被執行

多執行緒 15-9 15.2 實作 Runnable 介面來建立執行緒 如果類別本身已經繼承了某個父類別, 可以利用實作 Runnable 介面的方式建立執行緒 Runnable 介面裡宣告了抽象的 run() method, 因此把處理執行緒的程式碼放在 run() 裡就可以建立執行緒

多執行緒 15-10 下面的實例說明了 Runnable 介面的使用 : 01 // app15_3, 實作 Runnable 介面來建立執行緒 02 class CTest implements Runnable // 由 CTest 類別實作 Runnable 介面 03 { 04 private String id; 05 public CTest(String str) // 建構元, 設定成員 id 06 { 07 id=str; 08 } 09 public void run() // 詳細定義 runnable() 介面裡的 run() method 10 { 11 for(int i=0;i<4;i++) 12 { 13 for(int j=0;j<100000000;j++);// 空迴圈, 用來拖慢 14 行執行的速度 14 System.out.println(id+" is running.."); 15 } 16 } 17 } 18 19 public class app15_3 20 { 21 public static void main(string args[])

多執行緒 15-11 22 { 23 CTest dog=new CTest("doggy"); 24 CTest cat=new CTest("kitty"); 25 Thread t1=new Thread(dog); // 產生 Thread 類別的物件 t1 26 Thread t2=new Thread(cat); // 產生 Thread 類別的物件 t2 27 t1.start(); // 用 t1 啟動執行緒 28 t2.start(); // 用 t2 啟動執行緒 29 } 30 } /* app15_3 OUTPUT------- 第 28 行用 t2 物件呼叫 run() method 第 27 行用 t1 物件呼叫 run() method -------------------------*/

多執行緒 15-12 15.3 執行緒的管理 15.3.1 執行緒的生命週期 每一個執行緒, 在其產生和銷毀之前, 均會處於下列四種狀態之一 : 新產生的 (newly created) 可執行的 (runnable) 被凍結的 (blocked) 銷毀的 (dead)

多執行緒 15-13 執行緒狀態的轉移與 method 之間的關係可由下圖來表示 : 新產生的執行緒 start() 可執行的執行緒 wait() sleep() notify() sleep() 結束 被凍結的執行緒 run() 結束 銷毀的執行緒

多執行緒 15-14 新產生的執行緒用 new Thread() 建立物件時 可執行的狀態當 start() method 啟動執行緒時, 執行緒便進入可執行的狀態 被凍結的狀態發生下列的事件時, 凍結狀態的執行緒便產生 : 1. 該執行緒呼叫物件的 wait() method 2. 該執行緒本身呼叫 sleep() method 3. 該執行緒和另一個執行緒 join() 在一起 銷毀的狀態當 run() method 執行結束, 或是由執行緒呼叫它的 stop() method 時

多執行緒 15-15 15.3.2 讓執行緒小睡片刻 下面是 sleep() method 的使用範例 : 01 // app15_4, sleep() method 的示範 02 class CTest extends Thread // 從 Thread 類別延伸出子類別 03 { 04 private String id; 05 public CTest(String str) // 建構元, 設定成員 id 06 { 07 id=str; 08 } 09 public void run() // 改寫 Thread 類別裡的 run() method 10 { 11 for(int i=0;i<4;i++) 12 { 13 try 14 { 15 sleep((int)(1000*math.random())); 16 } 17 catch(interruptedexception e){} 18 System.out.println(id+" is running.."); 19 } 20 } sleep() method 必須寫在 try-catch 區塊裡

多執行緒 15-16 21 } 22 23 public class app15_4 24 { 25 public static void main(string args[]) 26 { 27 CTest dog=new CTest("doggy"); 28 CTest cat=new CTest("kitty"); 29 dog.start(); 30 cat.start(); 31 } 32 } /* app15_4 OUTPUT------- 第 30 行用 cat 物件呼叫 start() method 第 29 行用 dog 物件呼叫 start() method -------------------------*/

多執行緒 15-17 15.3.3 等待執行緒 在兩個執行緒啟動之後, 再加上一行列印字串的範例, 結果會怎樣呢? 01 // app15_5, 執行緒排程的設計 ( 一 ) 02 // 將 app15_4 的 CTest 類別置於此處 03 public class app15_5 04 { 05 public static void main(string args[]) 06 { 07 CTest dog=new CTest("doggy"); 08 CTest cat=new CTest("kitty"); 09 dog.start(); // 用 dog 物件來啟動執行緒 10 cat.start(); // 用 cat 物件來啟動執行緒 11 System.out.println("main() method finished"); 12 } 13 } /* app15_5 OUTPUT------- main() method finished ---------------------*/

多執行緒 15-18 下面是執行緒排程設計的範例 : 01 // app15_6, 執行緒排程的設計 ( 二 ) 02 // 將 app15_4 的 CTest 類別置於此處 03 public class app15_6 04 { 05 public static void main(string args[]) 06 { 07 CTest dog=new CTest("doggy"); 08 CTest cat=new CTest("kitty"); 09 10 dog.start(); // 啟動 dog 執行緒 11 try 12 { 13 dog.join(); // 限制 dog 執行緒結束後才能往下執行 14 cat.start(); // 啟動 cat 執行緒 15 cat.join(); // 限制 cat 執行緒結束後才能往下執行 16 } 17 catch(interruptedexception e){} 18 System.out.println("main() method finished"); 19 } 20 } join() 必須寫在 try-catch 區塊裡

多執行緒 15-19 /* app15_6 OUTPUT------- 先執行 dog 執行緒 再執行 cat 執行緒 main() method finished 最後再執行第 18 行的敘述 -------------------------*/

多執行緒 15-20 15.4 同步處理 如果兩個執行緒共用一個變數, 且其中一個執行緒在 run() method 還沒結束前, 另一個執行緒已開始啟動, 可能會造成錯誤, 如下面的範例 : 01 // app15_7, 沒有同步處理的執行緒 02 class CBank 03 { 04 private static int sum=0; 05 public static void add(int n) 06 { 07 int tmp=sum; 08 tmp=tmp+n; // 累加匯款總額 09 try 10 { 11 Thread.sleep((int)(1000*Math.random())); // 小睡 0~1 秒鐘 12 } 13 catch(interruptedexception e){} 14 sum=tmp; 15 System.out.println("sum= "+sum); 16 } 17 } 18 class CCustomer extends Thread // CCustomer 類別, 繼承自 Thread 類別

多執行緒 15-21 19 { 20 public void run() // run() method 21 { 22 for(int i=1;i<=3;i++) 23 CBank.add(100); // 將 100 元分三次匯入 24 } 25 } 26 public class app15_7 27 { 28 public static void main(string args[]) 29 { 30 CCustomer c1=new CCustomer(); 31 CCustomer c2=new CCustomer(); 32 c1.start(); 33 c2.start(); 34 } 35 } /* app15_7 OUTPUT----( 沒有加 synchronized 的執行結果 ) sum= 100 sum= 100 sum= 200 sum= 300 sum= 200 sum= 300 -----------------------*/

多執行緒 15-22 下圖顯示了造成錯誤的原因 : 處理 c1 執行緒的 add() tmp=sum=0 tmp=tmp+n=100 sum=tmp=100 sum=0 sum=100 sum=0 處理 c2 執行緒的 add() sum=100 tmp=sum=0 tmp=tmp+n=100 sum=tmp=100 在正常的情況下, 應處理完 c1 執行緒之後, 再接著處理 c2 執行緒 尚未處理完 c1 執行緒便接著處理 c2 執行緒, 因此導致共同變數寫入的錯誤

多執行緒 15-23 利用 synchronized 關鍵字即可修正前敘的錯誤 : 05 public synchronized static void add(int n) 06 {...... 在 add() method 之前加上 17 } synchronized 關鍵字 程式執行的結果應如下所示 : /* app15_7 OUTPUT----( 加上 synchronized 的執行結果 ) sum= 100 sum= 200 sum= 300 sum= 400 sum= 500 sum= 600 -----------------------*/

多執行緒 15-24