版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2009級(jí)實(shí)訓(xùn)指導(dǎo)專(zhuān)題技術(shù),——Java多線(xiàn)程編程,知識(shí)目標(biāo),了解線(xiàn)程和進(jìn)程的區(qū)別掌握J(rèn)ava多線(xiàn)程的兩種實(shí)現(xiàn)方法和區(qū)別了解線(xiàn)程狀態(tài)變化了解多線(xiàn)程的主要操作方法,技能目標(biāo),了解線(xiàn)程概念并能創(chuàng)建多線(xiàn)程程序,項(xiàng)目任務(wù),完成一個(gè)倒計(jì)時(shí)窗口,自定義刷新時(shí)間,精確顯示天數(shù)、小時(shí)數(shù)、分鐘數(shù)和秒數(shù),項(xiàng)目解析,采用GUI實(shí)現(xiàn)界面,調(diào)用API,其實(shí)現(xiàn)分為兩個(gè)步驟:創(chuàng)建線(xiàn)程,線(xiàn)程通信,項(xiàng)目解析,一、線(xiàn)程概念,進(jìn)行與線(xiàn)程操作系統(tǒng)分時(shí)間片輪流運(yùn)行每一個(gè)
2、程序,我們認(rèn)為是同時(shí)執(zhí)行這些程序工作——同時(shí)運(yùn)行多個(gè)不同的進(jìn)程每個(gè)進(jìn)行都有獨(dú)立的代碼和數(shù)據(jù)空間,進(jìn)程間的切換會(huì)有較大的開(kāi)銷(xiāo)線(xiàn)程是進(jìn)一步發(fā)展這個(gè)概念,把不同進(jìn)程間的切換在單個(gè)進(jìn)程的若干不同功能模塊之間的切換同一類(lèi)線(xiàn)程共享代碼和數(shù)據(jù)空間,每個(gè)線(xiàn)程由獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線(xiàn)程切換開(kāi)銷(xiāo)小線(xiàn)程是一個(gè)程序內(nèi)部的順序控制流多線(xiàn)程:在同一個(gè)應(yīng)用程序中有多個(gè)順序流同時(shí)執(zhí)行,一、線(xiàn)程概念,JVM啟動(dòng)時(shí)會(huì)有一個(gè)由主方法(public s
3、tatic void main(String args[]){})所定義的線(xiàn)程ThreadDemo.java:程序獲得運(yùn)行的主線(xiàn)程對(duì)象t,設(shè)置優(yōu)先級(jí)為9,使用for循環(huán)設(shè)計(jì)輸出線(xiàn)程名和0-4的數(shù)字,每次循環(huán)讓線(xiàn)程睡眠100msJava的線(xiàn)程是通過(guò)java.lang.Thread類(lèi)來(lái)實(shí)現(xiàn)的可以通過(guò)創(chuàng)建Thread的實(shí)例來(lái)創(chuàng)建新的線(xiàn)程每個(gè)線(xiàn)程都是通過(guò)某個(gè)特定的Thread對(duì)象所對(duì)應(yīng)的run()來(lái)完成其操作的,方法run()稱(chēng)為線(xiàn)程體
4、通過(guò)調(diào)用Thread類(lèi)的start()方法來(lái)啟動(dòng)一個(gè)線(xiàn)程,二、線(xiàn)程創(chuàng)建、啟動(dòng),可以有兩種方式創(chuàng)建新線(xiàn)程第一種定義一個(gè)Thread的子類(lèi)并重寫(xiě)run()方法class MyThread extends Thread{public void run(){}}生成該類(lèi)的對(duì)象MyThread myThread=new MyThread();啟動(dòng)線(xiàn)程myThread.start();,二、線(xiàn)程創(chuàng)建、啟動(dòng),可以有兩種方式創(chuàng)建新
5、線(xiàn)程第二種定義一個(gè)線(xiàn)程類(lèi)實(shí)現(xiàn)Runnable接口,Runnable接口中只有一個(gè)方法:public void run()定義線(xiàn)程體class MyRun implements Runnable{}使用Thread類(lèi)調(diào)用該接口實(shí)現(xiàn)類(lèi)對(duì)象Thread myThread=new Thread(new MyRun());啟動(dòng)線(xiàn)程myThread.start();使用Runnable接口可以為多個(gè)線(xiàn)程提供共享的數(shù)據(jù)在實(shí)現(xiàn)Runn
6、able接口的類(lèi)中的run()方法中可以使用Thread的靜態(tài)方法:public static Thread currentThread()獲取當(dāng)前線(xiàn)程的引用,二、線(xiàn)程創(chuàng)建、啟動(dòng),可以有兩種方式創(chuàng)建新線(xiàn)程第一種ThreadDemoEX.java:通過(guò)繼承Thread構(gòu)建新線(xiàn)程,程序中存在3個(gè)線(xiàn)程:第一個(gè)是main()方法所在的主線(xiàn)程,主線(xiàn)程執(zhí)行main()方法中的代碼,另外兩個(gè)線(xiàn)程分別是在main()中創(chuàng)建的。只有程序中出main(
7、)主線(xiàn)程外的其他線(xiàn)程都已經(jīng)運(yùn)行結(jié)束,main()主線(xiàn)程才運(yùn)行結(jié)束第二種ThreadDemoEX.java:通過(guò)實(shí)現(xiàn)Runnable接口構(gòu)建新線(xiàn)程,三、線(xiàn)程狀態(tài)與生命周期,每個(gè)Java程序都有一個(gè)默認(rèn)的主線(xiàn)程,由系統(tǒng)自動(dòng)生成,對(duì)應(yīng)應(yīng)用程序而言就是main()方法執(zhí)行的線(xiàn)程。要實(shí)現(xiàn)多線(xiàn)程,必須在主線(xiàn)程中創(chuàng)建新的線(xiàn)程對(duì)象新線(xiàn)程在生命周期中需要經(jīng)歷5中狀態(tài):新建:線(xiàn)程對(duì)象被聲明并創(chuàng)建就緒:調(diào)用start()方法,擁有相應(yīng)的內(nèi)存空間和
8、所屬資源,進(jìn)入線(xiàn)程隊(duì)列等候CPU調(diào)度運(yùn)行:處于就緒狀態(tài)的線(xiàn)程被調(diào)度并獲得CPU資源阻塞:一個(gè)正運(yùn)行的線(xiàn)程因某種原因讓出CPU資源并暫時(shí)中止運(yùn)行死亡:線(xiàn)程不具有繼續(xù)運(yùn)行的能力(原因兩種:線(xiàn)程完成自己全部工作;線(xiàn)程被強(qiáng)制性中止),三、線(xiàn)程狀態(tài)與生命周期,四、線(xiàn)程控制方法,四、線(xiàn)程控制方法,四、線(xiàn)程控制方法,TestInterrupt.javaTestJoin.javaTestYield.javaTestPriority.java
9、,五、線(xiàn)程通信,買(mǎi)票程序:TicketDemo.java程序中對(duì)于票數(shù)的操作步驟:判斷票數(shù)是否大于0,若大于0則表示還有票可以賣(mài)若票數(shù)大于0,則將票賣(mài)出實(shí)際中,在上面2步之間加入了延遲操作,那么一個(gè)線(xiàn)程就有可能在還沒(méi)有對(duì)票數(shù)進(jìn)行減操作之前,其他線(xiàn)程就已經(jīng)將票數(shù)減少了,主要就會(huì)出現(xiàn)票數(shù)為負(fù)的情況或重復(fù)賣(mài)票的情況,五、線(xiàn)程通信,解決上面問(wèn)題就必須使用同步,關(guān)鍵字synchronized同步代碼塊:TicketDemo2.java
10、synchronized(同步對(duì)象){//需要同步的代碼;}同步方法:TicketDemo3.javasynchronized 方法返回值 方法名稱(chēng)(參數(shù)列表){},五、線(xiàn)程通信,線(xiàn)程同步可以保證資源共享操作的正確性,但過(guò)多同步可能會(huì)產(chǎn)生問(wèn)題:死鎖。死鎖就是指兩個(gè)線(xiàn)程都在等待彼此先完成,造成了程序的停滯,一般死鎖都是在程序運(yùn)行時(shí)出現(xiàn)的死鎖例子:ThreadDeadLock.javaJava技術(shù)既不能發(fā)現(xiàn)死鎖也不能避免死鎖,
11、因此程序員編程時(shí)需要注意死鎖問(wèn)題,盡量避免線(xiàn)程因?yàn)槟硞€(gè)條件為滿(mǎn)足而受阻時(shí),不能讓其繼續(xù)占有資源,比如采用wait()方法釋放同步鎖,notify()方法喚醒等待隊(duì)列中第一個(gè)線(xiàn)程,并把它移入同步鎖申請(qǐng)隊(duì)列;如果有多個(gè)對(duì)象需要互斥范文,應(yīng)確定線(xiàn)程獲得死鎖的順序,并保證整個(gè)程序以相反的順序釋放死鎖,六、線(xiàn)程應(yīng)用案例,制作一個(gè)簡(jiǎn)單的國(guó)慶倒計(jì)時(shí)牌,計(jì)算距離中華人民共和國(guó)建國(guó)65周年還有多少時(shí)間,顯示剩余的天數(shù)、小時(shí)數(shù)、分鐘數(shù)和秒數(shù),以電子表的
12、形式,每秒刷新一次。實(shí)現(xiàn):TimeFrame.java,補(bǔ)充,注解,注解,注解(也稱(chēng)元數(shù)據(jù))是眾多引入到Java SE5中的重要的語(yǔ)言變化之一。注解類(lèi)型的主要目的是,以標(biāo)準(zhǔn)化和結(jié)構(gòu)化的方式來(lái)表示信息。這些信息可由自動(dòng)化處理工具來(lái)讀取與處理,也可以增加程序員的理解。因而提供了一種結(jié)構(gòu)化的,并且具有類(lèi)型檢查能力的新途徑,使得程序員能夠?yàn)榇a加入元數(shù)據(jù),而不會(huì)導(dǎo)致代碼雜亂且難以閱讀。注解采用能被Java編譯器進(jìn)行檢查、驗(yàn)證的格式,存儲(chǔ)有關(guān)程
13、序的額外信息。通過(guò)使用注解,可以將這些元數(shù)據(jù)保存在Java源代碼中,同時(shí),注解的優(yōu)點(diǎn)還包括:附屬文件的自動(dòng)生成,例如部署描述符或者bean信息類(lèi);測(cè)試、日志、事務(wù)語(yǔ)義等代碼的自動(dòng)生成。Java語(yǔ)言本身提供的注解不多,但它提供了一個(gè)強(qiáng)大的機(jī)制,用于定義自己的注解。程序員更多的是使用開(kāi)發(fā)環(huán)境或開(kāi)發(fā)工具中自定義的注解,這些自定義的注解數(shù)量眾多,功能強(qiáng)大,是程序員的有力工具,一、內(nèi)置注解,內(nèi)置注解是指Java語(yǔ)言?xún)?nèi)部已定義好的注解,可直接使用。
14、Java SE預(yù)定義了三種標(biāo)準(zhǔn)注解(在java.lang包中)和四種元注解(在java.lang.annotation包中)。定義在java.lang包中的三種標(biāo)準(zhǔn)注解如下:@Override:表示當(dāng)前的方法定義將重寫(xiě)父類(lèi)中的方法。如果不小心拼寫(xiě)錯(cuò)誤,或者簽名對(duì)不上重寫(xiě)的方法,編譯器就會(huì)發(fā)出錯(cuò)誤提示。@Deprecated:如果使用了用它注解的程序元素,那么編譯器會(huì)發(fā)出警告信息。@SuppressWarnings:關(guān)閉指定的編譯器
15、警告信息annotation并不直接影響代碼語(yǔ)義,但是它工作的方式被看作類(lèi)似程序的工具或者類(lèi)庫(kù),它會(huì)反過(guò)來(lái)對(duì)正在運(yùn)行的程序語(yǔ)義有所影響。,@Override,java.lang.Override是J2SE 5.0中標(biāo)準(zhǔn)的annotation類(lèi)型之一,它告訴編譯器某個(gè)方法必須是重寫(xiě)父類(lèi)中的方法,編譯器得知這項(xiàng)信息后,在編譯程序時(shí)如果發(fā)現(xiàn)該方法并非重寫(xiě)父類(lèi)中的方法,就會(huì)報(bào)告錯(cuò)誤。該注解只能應(yīng)用于方法。例子:OverrideTest.ja
16、va現(xiàn)在對(duì)Equals()方法加上@Override注解,要求編譯器必須檢查這個(gè)方法是不是重寫(xiě)父類(lèi)的某個(gè)方法,但編譯器發(fā)現(xiàn)父類(lèi)Object類(lèi)中并沒(méi)有這個(gè)方法,所以它會(huì)報(bào)告如下錯(cuò)誤,@Deprecated,java.lang.Deprecated是J2SE 5.0中標(biāo)準(zhǔn)的annotation類(lèi)型之一,它告訴編譯器某個(gè)程序元素已經(jīng)不建議使用,如果試圖使用或重新定義該方法,則發(fā)出警告信息例子:DeprecatedTest.java,@Su
17、ppressWarnings,下面的方法f()中定義了一個(gè)ArrayList類(lèi),但同時(shí)會(huì)出現(xiàn)警告信息。public void f() { List list = new ArrayList(); list.add("hello");}警告信息表示List類(lèi)必須使用泛型才是安全的,才可以進(jìn)行類(lèi)型檢查。如果想不顯示這個(gè)警告信息有兩種方法。一個(gè)是將這個(gè)方法進(jìn)行如下改寫(xiě): 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和前兩個(gè)注解不一樣。前兩個(gè)注解是沒(méi)有元素的。因而可寫(xiě)成:@Override 或@ Override(),而SuppressWarnings注解有一個(gè)元素,類(lèi)型為String[]。按注解定義的約定,單一元素(即只有一個(gè)元素)的名字建議取為value。這樣在使用注解時(shí)可簡(jiǎn)化。annotation語(yǔ)法允許在annotation名后跟括號(hào)
20、,括號(hào)中是使用逗號(hào)分割的“name = value”對(duì),用于為annotation的成員賦值。例如下面的代碼片段:@SuppressWarnings({"unchecked","deprecation"})public void f() {List list = new ArrayList(); list.add("hello");},@SuppressWar
21、nings,@SuppressWarnings 類(lèi)型只定義了一個(gè)單一的成員,所以只有一個(gè)簡(jiǎn)單的value = {...}作為“name = value”對(duì)。又由于成員值是一個(gè)數(shù)組,故使用大括號(hào)來(lái)聲明數(shù)組值。注意:可以在下面的情況中縮寫(xiě)annotation:當(dāng)annotation只有單一成員,并且成員命名為“value =”。這時(shí)可以省去“value =”。比如將上面的@SuppressWarnings 進(jìn)行縮寫(xiě):@SuppressWa
22、rnings ({"unchecked" , "deprecation"})如果@SuppressWarnings所聲明的被禁止警告?zhèn)€數(shù)為一個(gè)時(shí),可以省去大括號(hào):@SuppressWarnings("unchecked")例子:SuppressWarningsTest.java,二、元注解,注解的強(qiáng)大之處是它不僅可以使Java程序變成自描述的,而且允許程序員自定義注解。注
23、解類(lèi)型的定義,是一種特殊的接口定義,只是在interface關(guān)鍵字前面加了一個(gè)符號(hào)@。編譯程序在編譯注解定義時(shí),自動(dòng)將注解從java.lang.annotation.Annotation接口繼承,因而不允許在注解后邊再加上extends子句。要注意:程序員人為地定義一個(gè)接口,從Annotation接口繼承,這個(gè)不會(huì)被編譯程序當(dāng)作注解。因此,注解的定義只能使用@interface定義。在任何可能定義接口的地方,都可以定義注解。接口的修飾符
24、都可以修飾注解。訪(fǎng)問(wèn)權(quán)限范圍也一樣。例如下面的語(yǔ)句:public @interface MyAnnotation { },二、元注解,上面的代碼是一個(gè)最簡(jiǎn)單的注解。這個(gè)注解沒(méi)有任何元素,也可以理解為是一個(gè)標(biāo)記注解。當(dāng)然,也可以定義有元素的注解。例如下面的語(yǔ)句:public @interface MyAnnotation { public int id();public String value() default “jav
25、a world”;}id和value類(lèi)似方法定義,value元素有一個(gè)缺省值,如果在注解某個(gè)方法時(shí)沒(méi)有給出value值,則該注解的處理器就會(huì)使用此元素的默認(rèn)值。可以按如下格式使用自定義注解MyAnnotation。@MyAnnotation(id =12, value = "java") public void f() {… },二、元注解,@Target 作為元注解類(lèi)型的@Target,它描述了注解所適
26、用的程序元素的種類(lèi)。當(dāng)一個(gè)注解類(lèi)型沒(méi)有@Target時(shí),則表明該注解可適用于所有程序元素上。當(dāng)存在@Target時(shí),編譯程序?qū)?qiáng)制實(shí)施指定的使用限制。它將被作為普通的annotation看待。當(dāng)它修飾一個(gè)特定的成員時(shí),它將發(fā)揮其應(yīng)用的作用。@Target(ElementType.METHOD) @interface MyAnnotation {}@MyAnnotation // 不正確,不能為類(lèi)注解public class C
27、omment{ @MyAnnotation // 正確,可以為方法注解public void method() },二、元注解,@Target @Target所指的目標(biāo)就是Java的語(yǔ)言元素如類(lèi)接口方法等。當(dāng)然,@Target還可以對(duì)其他的元素進(jìn)行限制,如構(gòu)造方法字段參數(shù)等。若只允許對(duì)方法和構(gòu)造方法進(jìn)行注解可以寫(xiě)成: @Target({ElementType.METHOD,ElementType.CONSTRUCTOR}
28、)@interface MyAnnotation {},二、元注解,@Retention既然可以自定義注解,當(dāng)然也就可以讀取程序中的注解。annotation 的@Retention定義了該annotation被保留的時(shí)間長(zhǎng)短:某些annotation僅出現(xiàn)在源代碼中,但被編譯器丟棄;而另一些卻被編譯在 class文件中;編譯在class文件中的annotation可能會(huì)被虛擬機(jī)忽略,而另一些在class被裝載時(shí)將被讀取。@Ret
29、ention(RetentionPolicy.SOURCE) @interface MyAnnotation1 { }@Retention(RetentionPolicy.CLASS) @interface MyAnnotation2 {}@Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation3 {}說(shuō)明:其中第一行代碼的作用是不將注解保存在class文件中,也就是說(shuō)
30、像“//注釋”一樣在編譯時(shí)被過(guò)濾掉了,第二行代碼的作用是只將注解保存在class文件中,使用反射讀取注解時(shí)忽略這些注解,第三行代碼的作用是將注解保存在class文件中,也可以通過(guò)反射讀取注解,二、元注解,@Inherited@Inherited也是一個(gè)標(biāo)記型標(biāo)記,表示注解類(lèi)型會(huì)被自動(dòng)繼承。如果一個(gè)使用了@Inherited修飾的注解類(lèi)型被用于一個(gè)class,則這個(gè)注解將被用于該class的子類(lèi)。@Inherited @inte
31、rface MyAnnotation { }@MyAnnotationpublic class ParentClass {}public class ChildClass extends ParentClass { }在以上代碼中,ChildClass和ParentClass一樣都已被MyAnnotation注解了。,二、元注解,@Documented@Documented 這個(gè)注解和它的名子一樣與文檔有關(guān)。在默認(rèn)的情況
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)題技術(shù)檔案簡(jiǎn)介
- 兒科護(hù)理技術(shù)實(shí)訓(xùn)指導(dǎo)
- 《言語(yǔ)治療技術(shù)》實(shí)訓(xùn)指導(dǎo)
- 《蝦蟹養(yǎng)殖技術(shù)》實(shí)訓(xùn)指導(dǎo)
- 內(nèi)護(hù)實(shí)訓(xùn)指導(dǎo)
- 針灸針刺實(shí)訓(xùn)指導(dǎo)
- 《產(chǎn)品速寫(xiě)》實(shí)訓(xùn)指導(dǎo)
- 《健康評(píng)估》實(shí)訓(xùn)指導(dǎo)
- 《健康評(píng)估》實(shí)訓(xùn)指導(dǎo)
- 耕地統(tǒng)計(jì)分析專(zhuān)題技術(shù)方案
- 電工電子技術(shù)實(shí)訓(xùn)指導(dǎo)書(shū)
- 企業(yè)管理綜合實(shí)訓(xùn)實(shí)訓(xùn)指導(dǎo)書(shū)新
- 《網(wǎng)頁(yè)設(shè)計(jì)與制作綜合實(shí)訓(xùn)》實(shí)訓(xùn)指導(dǎo)書(shū)
- 鉗工實(shí)訓(xùn)指導(dǎo)書(shū)
- 旅行社實(shí)訓(xùn)指導(dǎo)
- 綜合實(shí)訓(xùn)專(zhuān)題報(bào)告
- cam實(shí)訓(xùn)指導(dǎo)書(shū)
- 銑削實(shí)訓(xùn)指導(dǎo)書(shū)
- 城軌實(shí)訓(xùn)指導(dǎo)書(shū)
- 電工實(shí)訓(xùn)指導(dǎo)書(shū)
評(píng)論
0/150
提交評(píng)論