版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、任務(wù)三:飄動字幕動畫程序設(shè)計,單元五:Java語言高級程序設(shè)計,教學(xué)目標,知識目標掌握線程的概念以及線程與進程的區(qū)別;理解線程的狀態(tài)和生命周期;掌握Thread類和Runnable接口的常用方法。,能力目標運用多線程的實現(xiàn)方法處理線程問題;能會繼承Thread類或?qū)崿F(xiàn)Runnable接口來完成多線程技術(shù)實現(xiàn)。,教學(xué)內(nèi)容,,,4,,,任務(wù)陳述,1,,,2,,,3,知識準備,任務(wù)實施,任務(wù)拓展,,任務(wù)實訓(xùn),,5,任務(wù)描述:
2、 運用Java多線程技術(shù)編寫一個簡單的動畫,要求運行程序時窗口會顯示一個飄動的字幕,每隔1秒字幕會自動改變顯示的位置,先自左向右移動,到達窗口右邊界時,再改變?yōu)樽杂蚁蜃笠苿?。運行結(jié)果:,1. 任務(wù)陳述,計算機用來模擬和解決人們現(xiàn)實生活中問題,因此使用編程語言描述現(xiàn)實世界同樣需要串、并行共存。計算機中的并行處理即同時處理多個任務(wù),一般叫“多任務(wù)”。多任務(wù)處理方式的優(yōu)點是充分利用CPU資源,提高效率。含有多個CPU的計算機可將不同任務(wù)分配
3、到不同CPU 實現(xiàn)并行處理;單CPU則靠快速切換任務(wù)來模擬并行處理,使系統(tǒng)的空轉(zhuǎn)時間最少。,2. 知識準備,3.1 線程與進程的概念和關(guān)系3.1.1 線程與進程的概念程序(program)是為實現(xiàn)特定目標或解決特定問題而用計算機語言編寫的命令序列的集合。進程(Process)是程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,對應(yīng)了從代碼加載、執(zhí)行至執(zhí)行完畢的一個完整過程,是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。線程(Thread)是進程的
4、一個實體,CPU調(diào)度和分派的基本單位,是比進程更小的能獨立運行的基本單位。,2. 知識準備,3.1.2 線程與進程的關(guān)系一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。操作系統(tǒng)把資源分配給進程,而同一進程的所有線程共享該進程的所有資源。進程和線程的關(guān)系可以比喻成:當打開Word(Office中的Word)程序,編寫工作計劃.doc文件---打開一個進程而當執(zhí)行這個文件的打印工作---調(diào)用了Word中的
5、一個線程線程是作為CPU調(diào)度和分配的基本單位,而進程是擁有資源的基本單位。,2. 知識準備,3.2 線程的生命周期 一個線程都要經(jīng)歷一個從出現(xiàn)到死亡的過程,我們把這個過程稱之為生命周期。線程的生命周期包括4種狀態(tài):New(新生)、Runnable(可運行)、Blocked(被阻塞)和Dead(死亡)。,2. 知識準備,3.2.1 新生狀態(tài)當使用new操作符創(chuàng)建一個新的線程時,線程并不是馬上進行運行,此時線程處在新生(new
6、)狀態(tài)。3.2.2 可運行狀態(tài)當處于新生狀態(tài)的線程調(diào)用了start方法后,線程就開啟了成為了可運行(Runnable)了。3.2.3 被阻塞狀態(tài)當線程在可運行狀態(tài)下執(zhí)行了睡眠(sleep)、阻塞I/O操作、等待(wait)等操作后,線程就進入了被阻塞狀態(tài),另一個線程就可以被調(diào)度運行了。3.2.4 死亡狀態(tài)線程在可運行狀態(tài)下經(jīng)過一個正常的run方法結(jié)束完成自然死亡。再有就是可以使用stop方法來殺死一個線程,同時拋出一個Thr
7、eadDeath錯誤對象。,2. 知識準備,注意:Java規(guī)范中并沒有把運行單獨作為一個狀態(tài),因為即使調(diào)用了start方法,是否接著運行還要看CPU是否有空閑調(diào)用。,3.3 線程的創(chuàng)建3.3.1 Thread類的簡介 Thread類是Java提供用來的創(chuàng)建線程的核心類,存在于java.lang包中,它綜合了一個線程所需的屬性和方法,可以使用該類進行線程的創(chuàng)建、線程的常用操作以及設(shè)置線程優(yōu)先級等。 常用方法:
8、 構(gòu)造方法: public Thread():創(chuàng)建一個新的線程對象。 public Thread(String name):創(chuàng)建一個名字為name的新線程對象。 public Thread(Runnable target,String name):在現(xiàn)有的target對象基礎(chǔ) 上創(chuàng)建一個名字為name的線程對象,新的對象實際上是把target作為
9、 了運行對象。,2. 知識準備,常用方法: public void start():啟動線程。如果能獲得CPU的使用權(quán)就會自動執(zhí)行調(diào)用run()方法。 public void run():這是Thread線程類中最重要的方法,是線程執(zhí)行的起點,線程具體的操作都要編寫在此方法中。 public static void sleep(long mills):使正在運行的線程休眠m
10、ills好秒后再運行。 public final getPriority():獲得線程的優(yōu)先級。 public final setPriority(int priority):設(shè)置線程的優(yōu)先級。 public final boolean isAlive():判斷線程是否在活動,如果是返回true,否則返回false。,2. 知識準備,3.3.2 Runnable接口Java不支持多
11、繼承。一旦一個類繼承了Thread類,就不能再繼承其他的類。用戶若想讓其他類支持多線程,那么這個類還可以通過實現(xiàn)Runnable接口。Runnable接口位于java.lang包中,只提供了一個run()方法,該方法與Thread類中run()方法作用一樣,線程執(zhí)行的具體操作都要寫在此方法中。,2. 知識準備,3.3.3 使用Thread類創(chuàng)建線程創(chuàng)建步驟:首先編寫的線程類需要繼承Thread類來實現(xiàn)多線程。其次設(shè)計Thread
12、的子類,然后根據(jù)工作需要重新設(shè)計線程中的 run方法(方法的重寫)。最后再使用start方法啟動線程,將執(zhí)行權(quán)轉(zhuǎn)交給run()方法?!纠?-1】下面示例演示使用Thread類來創(chuàng)建線程并啟動線程,然后要求在線程中進行每隔1秒鐘打印一行數(shù)據(jù)。,2. 知識準備,【注意】這個程序的運行結(jié)果在不同機器上結(jié)果是不一樣的,到底什么時候使用線程1還是線程2是由操作系統(tǒng)的線程處理機制控制的。并且這個運行不會結(jié)束,只有強行關(guān)掉應(yīng)用程序線程才會關(guān)閉
13、。因此注意在寫run()方法時一定要在里面加入結(jié)束判斷語句,可以是有限次的循環(huán),也可以是對某個界限的判斷。,public class ThreadEx extends Thread { //繼承Thread類 public ThreadEx(String name){//帶名字的構(gòu)造方法 super(name); } //重寫run()方法,
14、編寫代碼 public void run(){ System.out.println(this.getName()+” 打印信息”); try{ Thread.sleep(1000);//讓線程休眠1秒鐘,并拋出異常 }catch(Exception ex){
15、 ex.printStackTrace(); }}public class Main { public static void main(String args[]){ //創(chuàng)建線程對象 ThreadEx thread1=new ThreadEx(“線程1”); ThreadEx t
16、hread2=new ThreadEx(“線程2”); //啟動線程 thread1.start(); thread2.start(); }},【例5-1】關(guān)鍵代碼,上面的例子沒有辦法預(yù)測是哪個線程先運行是因為這兩個線程被CPU認為是相同優(yōu)先級的線程。如要想使得線程之間可以有個預(yù)想的執(zhí)行順序那么可以通過setPriority(int
17、 priority)方法來設(shè)置線程的優(yōu)先級,優(yōu)先級的改變是可以影響CPU調(diào)用線程的順序。優(yōu)先級是一個1-10的數(shù),默認為5,Thread類中包含了3個靜態(tài)常量:public static final int NORM_PRIORITY=5public static final int MIN_PRIORITY=1public static final int MAX_PRIORITY=10【例5-2】根據(jù)上例加入線程優(yōu)先級設(shè)置
18、,要求線程1的優(yōu)先級最高,線程2的優(yōu)先級最低。,2. 知識準備,public class ThreadEx extends Thread { //繼承Thread類 public ThreadEx(String name,int priority){//帶名字的構(gòu)造方法 super(name); this.setPriority(priority);}public void run(){
19、 //與上例一樣}public class Main { public static void main(String args[]){ //創(chuàng)建線程對象,并設(shè)置優(yōu)先級 ThreadEx thread1=new ThreadEx(“線程1”,Thread.MAX_PRIORITY); ThreadEx thread2=new ThreadEx(“線程2”, Thread.MIN_PRIORITY)
20、; //啟動線程 thread1.start(); thread2.start(); }},【例5-2】關(guān)鍵代碼,3.3.4 使用Runnable接口創(chuàng)建線程創(chuàng)建步驟:首先線程類需要實現(xiàn)Runnable接口;其次實現(xiàn)接口中的run()方法;然后創(chuàng)建一個線程對象,并將對象作為參數(shù)傳遞給Thread類的構(gòu)造方法,從而生成一個Thread類;最后調(diào)用start()方法啟動線程?!纠?-3】下面示
21、例演示使用Runnable接口來創(chuàng)建線程并啟動線程,然后要求在線程中進行沒隔1秒鐘打印一行數(shù)據(jù)。,2. 知識準備,public void run(){ System.out.println(name+” 打印信息”); try{ Thread.sleep(1000);//讓線程休眠1秒鐘,并拋出異常 }catch(Exception ex){ ex.printStackTrace();
22、}}public static void main(String args[]){ //創(chuàng)建線程目標對象 RunnableEx re1=new RunnableEx (“線程1”); RunnableEx re2=new RunnableEx (“線程2”); //創(chuàng)建線程對象 Thread t1=new Thread(re1); Thread t2=new Thread(re2)
23、; //啟動線程 t1.start(); t2.start();},【例5-3】關(guān)鍵代碼,實施思路在窗口中,通過JLabel顯示一行文字,通過啟動一個線程,在線程中每隔一秒改變一次JLabel對象的位置可實現(xiàn)字幕飄動的動畫效果;創(chuàng)建一個主類MovingText繼承JFrame實現(xiàn)Runnable接口;主類MovingText構(gòu)造方法中創(chuàng)建JLabel對象,創(chuàng)建線程對象并啟動線程;實現(xiàn)Runnabl
24、e的run方法,用sleep方法休眠一秒,修改JLabel對象位置;在main方法中實例化MovingText。,3. 任務(wù)實施,程序代碼 public void run() {try {Thread t = Thread.currentThread();System.out.println("當前線程是: " + t);while (true) {Thread.sleep(
25、1000);//睡眠一秒鐘m_label.setBounds(10 + i * 10, 100, 150, 50);//設(shè)置飄動標志if (i > 20)bRight = false;if (i < 0)bRight = true;if (bRight)i++;elsei--;}} catch (Exception e) {
26、},3. 任務(wù)實施,一、實現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢 1. 適合多個相同的程序代碼的線程去處理同一個資源; 2. 可以避免java中的單繼承的限制; 3. 增加程序的健壯性,代碼可以被多個線程共享,代碼和數(shù)據(jù)獨立。二、守護線程的概念 主線程也有可能在子線程結(jié)束之前結(jié)束,并且子線程不受影響,不會因為主線程的結(jié)束而結(jié)束。在java程序中,只要前臺有一個線程在
27、運行,整個java程序進程就不會消失,所以此時可以設(shè)置一個后臺線程,這樣即使java進程消失了,此后臺線程依然能夠繼續(xù)運行。 【例5-4】下面示例演示使用setDaemon()方法來設(shè)置守護線程,從而滿足主線程結(jié)束后此守護線程也不會結(jié)束。,4. 任務(wù)拓展,public class DaemonTest implements Runnable { // 后臺線程int i = 0;public void run() {
28、 while (true) { System.out.println (Thread.currentThread().getName() + "在運行: " + i++);}}public static void main(String[] args) { DaemonTest he = new DaemonTest();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- (課件資料)《java程序設(shè)計與應(yīng)用》-張仕斌
- java程序設(shè)計基礎(chǔ) 習(xí)題答案 作者 代永亮 java程序設(shè)計基礎(chǔ)習(xí)題答案
- 電子商務(wù)客戶服務(wù)教學(xué)課件作者盤紅華項目三
- 電子商務(wù)客戶服務(wù)教學(xué)課件作者盤紅華項目六
- c語言程序設(shè)計_課件_5-
- 電子商務(wù)客戶服務(wù)教學(xué)課件作者盤紅華項目二
- 電子商務(wù)客戶服務(wù)教學(xué)課件作者盤紅華項目五
- 《算法及程序設(shè)計》(選修)課件
- 電子商務(wù)客戶服務(wù)教學(xué)課件作者盤紅華項目四
- 電子商務(wù)客戶服務(wù)教學(xué)課件作者盤紅華項目一
- java程序設(shè)計
- java語言程序設(shè)計教學(xué)大綱
- 《java程序設(shè)計》教學(xué)大綱doc
- c-++-程序設(shè)計教程課件
- 電力電子技術(shù)教學(xué)課件 ppt 作者 邊春元 宋崇輝 28532課件
- java程序設(shè)計復(fù)習(xí)
- java程序設(shè)計題目
- java程序設(shè)計-教案
- java課程設(shè)計---java程序設(shè)計
- java課程設(shè)計--java程序設(shè)計
評論
0/150
提交評論