2009級實訓(xùn)指導(dǎo)專題技術(shù)_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、2009級實訓(xùn)指導(dǎo)專題技術(shù),——Java多線程編程,知識目標(biāo),了解線程和進(jìn)程的區(qū)別掌握J(rèn)ava多線程的兩種實現(xiàn)方法和區(qū)別了解線程狀態(tài)變化了解多線程的主要操作方法,技能目標(biāo),了解線程概念并能創(chuàng)建多線程程序,項目任務(wù),完成一個倒計時窗口,自定義刷新時間,精確顯示天數(shù)、小時數(shù)、分鐘數(shù)和秒數(shù),項目解析,采用GUI實現(xiàn)界面,調(diào)用API,其實現(xiàn)分為兩個步驟:創(chuàng)建線程,線程通信,項目解析,一、線程概念,進(jìn)行與線程操作系統(tǒng)分時間片輪流運(yùn)行每一個

2、程序,我們認(rèn)為是同時執(zhí)行這些程序工作——同時運(yùn)行多個不同的進(jìn)程每個進(jìn)行都有獨(dú)立的代碼和數(shù)據(jù)空間,進(jìn)程間的切換會有較大的開銷線程是進(jìn)一步發(fā)展這個概念,把不同進(jìn)程間的切換在單個進(jìn)程的若干不同功能模塊之間的切換同一類線程共享代碼和數(shù)據(jù)空間,每個線程由獨(dú)立的運(yùn)行棧和程序計數(shù)器(PC),線程切換開銷小線程是一個程序內(nèi)部的順序控制流多線程:在同一個應(yīng)用程序中有多個順序流同時執(zhí)行,一、線程概念,JVM啟動時會有一個由主方法(public s

3、tatic void main(String args[]){})所定義的線程ThreadDemo.java:程序獲得運(yùn)行的主線程對象t,設(shè)置優(yōu)先級為9,使用for循環(huán)設(shè)計輸出線程名和0-4的數(shù)字,每次循環(huán)讓線程睡眠100msJava的線程是通過java.lang.Thread類來實現(xiàn)的可以通過創(chuàng)建Thread的實例來創(chuàng)建新的線程每個線程都是通過某個特定的Thread對象所對應(yīng)的run()來完成其操作的,方法run()稱為線程體

4、通過調(diào)用Thread類的start()方法來啟動一個線程,二、線程創(chuàng)建、啟動,可以有兩種方式創(chuàng)建新線程第一種定義一個Thread的子類并重寫run()方法class MyThread extends Thread{public void run(){}}生成該類的對象MyThread myThread=new MyThread();啟動線程myThread.start();,二、線程創(chuàng)建、啟動,可以有兩種方式創(chuàng)建新

5、線程第二種定義一個線程類實現(xiàn)Runnable接口,Runnable接口中只有一個方法:public void run()定義線程體class MyRun implements Runnable{}使用Thread類調(diào)用該接口實現(xiàn)類對象Thread myThread=new Thread(new MyRun());啟動線程myThread.start();使用Runnable接口可以為多個線程提供共享的數(shù)據(jù)在實現(xiàn)Runn

6、able接口的類中的run()方法中可以使用Thread的靜態(tài)方法:public static Thread currentThread()獲取當(dāng)前線程的引用,二、線程創(chuàng)建、啟動,可以有兩種方式創(chuàng)建新線程第一種ThreadDemoEX.java:通過繼承Thread構(gòu)建新線程,程序中存在3個線程:第一個是main()方法所在的主線程,主線程執(zhí)行main()方法中的代碼,另外兩個線程分別是在main()中創(chuàng)建的。只有程序中出main(

7、)主線程外的其他線程都已經(jīng)運(yùn)行結(jié)束,main()主線程才運(yùn)行結(jié)束第二種ThreadDemoEX.java:通過實現(xiàn)Runnable接口構(gòu)建新線程,三、線程狀態(tài)與生命周期,每個Java程序都有一個默認(rèn)的主線程,由系統(tǒng)自動生成,對應(yīng)應(yīng)用程序而言就是main()方法執(zhí)行的線程。要實現(xiàn)多線程,必須在主線程中創(chuàng)建新的線程對象新線程在生命周期中需要經(jīng)歷5中狀態(tài):新建:線程對象被聲明并創(chuàng)建就緒:調(diào)用start()方法,擁有相應(yīng)的內(nèi)存空間和

8、所屬資源,進(jìn)入線程隊列等候CPU調(diào)度運(yùn)行:處于就緒狀態(tài)的線程被調(diào)度并獲得CPU資源阻塞:一個正運(yùn)行的線程因某種原因讓出CPU資源并暫時中止運(yùn)行死亡:線程不具有繼續(xù)運(yùn)行的能力(原因兩種:線程完成自己全部工作;線程被強(qiáng)制性中止),三、線程狀態(tài)與生命周期,四、線程控制方法,四、線程控制方法,四、線程控制方法,TestInterrupt.javaTestJoin.javaTestYield.javaTestPriority.java

9、,五、線程通信,買票程序:TicketDemo.java程序中對于票數(shù)的操作步驟:判斷票數(shù)是否大于0,若大于0則表示還有票可以賣若票數(shù)大于0,則將票賣出實際中,在上面2步之間加入了延遲操作,那么一個線程就有可能在還沒有對票數(shù)進(jìn)行減操作之前,其他線程就已經(jīng)將票數(shù)減少了,主要就會出現(xiàn)票數(shù)為負(fù)的情況或重復(fù)賣票的情況,五、線程通信,解決上面問題就必須使用同步,關(guān)鍵字synchronized同步代碼塊:TicketDemo2.java

10、synchronized(同步對象){//需要同步的代碼;}同步方法:TicketDemo3.javasynchronized 方法返回值 方法名稱(參數(shù)列表){},五、線程通信,線程同步可以保證資源共享操作的正確性,但過多同步可能會產(chǎn)生問題:死鎖。死鎖就是指兩個線程都在等待彼此先完成,造成了程序的停滯,一般死鎖都是在程序運(yùn)行時出現(xiàn)的死鎖例子:ThreadDeadLock.javaJava技術(shù)既不能發(fā)現(xiàn)死鎖也不能避免死鎖,

11、因此程序員編程時需要注意死鎖問題,盡量避免線程因為某個條件為滿足而受阻時,不能讓其繼續(xù)占有資源,比如采用wait()方法釋放同步鎖,notify()方法喚醒等待隊列中第一個線程,并把它移入同步鎖申請隊列;如果有多個對象需要互斥范文,應(yīng)確定線程獲得死鎖的順序,并保證整個程序以相反的順序釋放死鎖,六、線程應(yīng)用案例,制作一個簡單的國慶倒計時牌,計算距離中華人民共和國建國65周年還有多少時間,顯示剩余的天數(shù)、小時數(shù)、分鐘數(shù)和秒數(shù),以電子表的

12、形式,每秒刷新一次。實現(xiàn):TimeFrame.java,補(bǔ)充,注解,注解,注解(也稱元數(shù)據(jù))是眾多引入到Java SE5中的重要的語言變化之一。注解類型的主要目的是,以標(biāo)準(zhǔn)化和結(jié)構(gòu)化的方式來表示信息。這些信息可由自動化處理工具來讀取與處理,也可以增加程序員的理解。因而提供了一種結(jié)構(gòu)化的,并且具有類型檢查能力的新途徑,使得程序員能夠為代碼加入元數(shù)據(jù),而不會導(dǎo)致代碼雜亂且難以閱讀。注解采用能被Java編譯器進(jìn)行檢查、驗證的格式,存儲有關(guān)程

13、序的額外信息。通過使用注解,可以將這些元數(shù)據(jù)保存在Java源代碼中,同時,注解的優(yōu)點(diǎn)還包括:附屬文件的自動生成,例如部署描述符或者bean信息類;測試、日志、事務(wù)語義等代碼的自動生成。Java語言本身提供的注解不多,但它提供了一個強(qiáng)大的機(jī)制,用于定義自己的注解。程序員更多的是使用開發(fā)環(huán)境或開發(fā)工具中自定義的注解,這些自定義的注解數(shù)量眾多,功能強(qiáng)大,是程序員的有力工具,一、內(nèi)置注解,內(nèi)置注解是指Java語言內(nèi)部已定義好的注解,可直接使用。

14、Java SE預(yù)定義了三種標(biāo)準(zhǔn)注解(在java.lang包中)和四種元注解(在java.lang.annotation包中)。定義在java.lang包中的三種標(biāo)準(zhǔn)注解如下:@Override:表示當(dāng)前的方法定義將重寫父類中的方法。如果不小心拼寫錯誤,或者簽名對不上重寫的方法,編譯器就會發(fā)出錯誤提示。@Deprecated:如果使用了用它注解的程序元素,那么編譯器會發(fā)出警告信息。@SuppressWarnings:關(guān)閉指定的編譯器

15、警告信息annotation并不直接影響代碼語義,但是它工作的方式被看作類似程序的工具或者類庫,它會反過來對正在運(yùn)行的程序語義有所影響。,@Override,java.lang.Override是J2SE 5.0中標(biāo)準(zhǔn)的annotation類型之一,它告訴編譯器某個方法必須是重寫父類中的方法,編譯器得知這項信息后,在編譯程序時如果發(fā)現(xiàn)該方法并非重寫父類中的方法,就會報告錯誤。該注解只能應(yīng)用于方法。例子:OverrideTest.ja

16、va現(xiàn)在對Equals()方法加上@Override注解,要求編譯器必須檢查這個方法是不是重寫父類的某個方法,但編譯器發(fā)現(xiàn)父類Object類中并沒有這個方法,所以它會報告如下錯誤,@Deprecated,java.lang.Deprecated是J2SE 5.0中標(biāo)準(zhǔn)的annotation類型之一,它告訴編譯器某個程序元素已經(jīng)不建議使用,如果試圖使用或重新定義該方法,則發(fā)出警告信息例子:DeprecatedTest.java,@Su

17、ppressWarnings,下面的方法f()中定義了一個ArrayList類,但同時會出現(xiàn)警告信息。public void f() { List list = new ArrayList(); list.add("hello");}警告信息表示List類必須使用泛型才是安全的,才可以進(jìn)行類型檢查。如果想不顯示這個警告信息有兩種方法。一個是將這個方法進(jìn)行如下改寫: public void f

18、() { List list = new ArrayList(); list.add("hello");}另外一種方法就是使用@SuppressWarnings,如下所示:@SuppressWarnings (value = {"unchecked"})public void f() { List list = new ArrayList(); list.add("h

19、ello");},@SuppressWarnings,要注意的是SuppressWarnings和前兩個注解不一樣。前兩個注解是沒有元素的。因而可寫成:@Override 或@ Override(),而SuppressWarnings注解有一個元素,類型為String[]。按注解定義的約定,單一元素(即只有一個元素)的名字建議取為value。這樣在使用注解時可簡化。annotation語法允許在annotation名后跟括號

20、,括號中是使用逗號分割的“name = value”對,用于為annotation的成員賦值。例如下面的代碼片段:@SuppressWarnings({"unchecked","deprecation"})public void f() {List list = new ArrayList(); list.add("hello");},@SuppressWar

21、nings,@SuppressWarnings 類型只定義了一個單一的成員,所以只有一個簡單的value = {...}作為“name = value”對。又由于成員值是一個數(shù)組,故使用大括號來聲明數(shù)組值。注意:可以在下面的情況中縮寫annotation:當(dāng)annotation只有單一成員,并且成員命名為“value =”。這時可以省去“value =”。比如將上面的@SuppressWarnings 進(jìn)行縮寫:@SuppressWa

22、rnings ({"unchecked" , "deprecation"})如果@SuppressWarnings所聲明的被禁止警告?zhèn)€數(shù)為一個時,可以省去大括號:@SuppressWarnings("unchecked")例子:SuppressWarningsTest.java,二、元注解,注解的強(qiáng)大之處是它不僅可以使Java程序變成自描述的,而且允許程序員自定義注解。注

23、解類型的定義,是一種特殊的接口定義,只是在interface關(guān)鍵字前面加了一個符號@。編譯程序在編譯注解定義時,自動將注解從java.lang.annotation.Annotation接口繼承,因而不允許在注解后邊再加上extends子句。要注意:程序員人為地定義一個接口,從Annotation接口繼承,這個不會被編譯程序當(dāng)作注解。因此,注解的定義只能使用@interface定義。在任何可能定義接口的地方,都可以定義注解。接口的修飾符

24、都可以修飾注解。訪問權(quán)限范圍也一樣。例如下面的語句:public @interface MyAnnotation { },二、元注解,上面的代碼是一個最簡單的注解。這個注解沒有任何元素,也可以理解為是一個標(biāo)記注解。當(dāng)然,也可以定義有元素的注解。例如下面的語句:public @interface MyAnnotation { public int id();public String value() default “jav

25、a world”;}id和value類似方法定義,value元素有一個缺省值,如果在注解某個方法時沒有給出value值,則該注解的處理器就會使用此元素的默認(rèn)值。可以按如下格式使用自定義注解MyAnnotation。@MyAnnotation(id =12, value = "java") public void f() {… },二、元注解,@Target 作為元注解類型的@Target,它描述了注解所適

26、用的程序元素的種類。當(dāng)一個注解類型沒有@Target時,則表明該注解可適用于所有程序元素上。當(dāng)存在@Target時,編譯程序?qū)?qiáng)制實施指定的使用限制。它將被作為普通的annotation看待。當(dāng)它修飾一個特定的成員時,它將發(fā)揮其應(yīng)用的作用。@Target(ElementType.METHOD) @interface MyAnnotation {}@MyAnnotation // 不正確,不能為類注解public class C

27、omment{ @MyAnnotation // 正確,可以為方法注解public void method() },二、元注解,@Target @Target所指的目標(biāo)就是Java的語言元素如類接口方法等。當(dāng)然,@Target還可以對其他的元素進(jìn)行限制,如構(gòu)造方法字段參數(shù)等。若只允許對方法和構(gòu)造方法進(jìn)行注解可以寫成: @Target({ElementType.METHOD,ElementType.CONSTRUCTOR}

28、)@interface MyAnnotation {},二、元注解,@Retention既然可以自定義注解,當(dāng)然也就可以讀取程序中的注解。annotation 的@Retention定義了該annotation被保留的時間長短:某些annotation僅出現(xiàn)在源代碼中,但被編譯器丟棄;而另一些卻被編譯在 class文件中;編譯在class文件中的annotation可能會被虛擬機(jī)忽略,而另一些在class被裝載時將被讀取。@Ret

29、ention(RetentionPolicy.SOURCE) @interface MyAnnotation1 { }@Retention(RetentionPolicy.CLASS) @interface MyAnnotation2 {}@Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation3 {}說明:其中第一行代碼的作用是不將注解保存在class文件中,也就是說

30、像“//注釋”一樣在編譯時被過濾掉了,第二行代碼的作用是只將注解保存在class文件中,使用反射讀取注解時忽略這些注解,第三行代碼的作用是將注解保存在class文件中,也可以通過反射讀取注解,二、元注解,@Inherited@Inherited也是一個標(biāo)記型標(biāo)記,表示注解類型會被自動繼承。如果一個使用了@Inherited修飾的注解類型被用于一個class,則這個注解將被用于該class的子類。@Inherited @inte

31、rface MyAnnotation { }@MyAnnotationpublic class ParentClass {}public class ChildClass extends ParentClass { }在以上代碼中,ChildClass和ParentClass一樣都已被MyAnnotation注解了。,二、元注解,@Documented@Documented 這個注解和它的名子一樣與文檔有關(guān)。在默認(rèn)的情況

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論