<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Picses' sky

    Picses' sky
    posts - 43, comments - 29, trackbacks - 0, articles - 24

    用Java線程獲取優(yōu)異性能(I)1

    Posted on 2007-07-18 13:11 Matthew Chen 閱讀(233) 評論(0)  編輯  收藏 所屬分類: Java MultiThread
    摘要
    用戶期望程序能展現(xiàn)優(yōu)異的性能。為了滿足這個(gè)期望,你的程序常常使用到線程。在這篇文章中我們開始練習(xí)使用線程。你將學(xué)習(xí)到線程、線程類及Runnable。
    用戶不喜歡反應(yīng)遲鈍的軟件。當(dāng)用戶單擊一個(gè)鼠標(biāo)時(shí),他們希望程序立即回應(yīng)他們的請求,即使程序正處于費(fèi)時(shí)的運(yùn)行之中,比如為一篇很長的文檔重編頁碼或等待一個(gè)網(wǎng)絡(luò)操作的完成。對用戶響應(yīng)很慢的程序其性能拙劣。為提高程序性能,開發(fā)者一般使用線程。
    這篇文章是探索線程的第一部份。雖然你可能認(rèn)為線程是一種難于掌握的事物,但我打算向你顯示線程是易于理解的。在這篇文章中,我將向你介紹線程和線程類,以及討論Runnable。此外,在后面的文章中,我將探索同步(通過鎖),同步的問題(比如死鎖),等待/通知機(jī)制,時(shí)序安排(有優(yōu)先權(quán)和沒有優(yōu)先權(quán)),線程中斷,計(jì)時(shí)器,揮發(fā)性,線程組和線程本地變量。
    閱讀關(guān)于線程設(shè)計(jì)的整個(gè)系列:
    ·第1部份:介紹線程和線程類,以及Runnable
    ·第2部份:使用同步使線程串行化訪問關(guān)鍵代碼部份
    注意
    這篇文章及其應(yīng)用程序的三個(gè)相關(guān)線程練習(xí)與applets不同。然而,我在應(yīng)用程序中介紹的多數(shù)應(yīng)用到applets。主要不同的是:為了安全的原因,不是所有的線程操作都可以放到一個(gè)applet中(我將在以后的文章中討論applets)。
    什么是線程?
    線程的概念并不難于掌握:它是程序代碼的一個(gè)獨(dú)立的執(zhí)行通道。當(dāng)多個(gè)線程執(zhí)行時(shí),經(jīng)由相同代碼的一個(gè)線程的通道通常與其它的不同。例如,假設(shè)一個(gè)線程執(zhí)行一段相當(dāng)于一個(gè)if-else語句的if部分的字節(jié)代碼時(shí),而另一個(gè)線程正執(zhí)行相當(dāng)于else部分的字節(jié)代碼。JVM怎樣保持對于每一個(gè)線程執(zhí)行的跟蹤呢?JVM給每一個(gè)線程它自己的方法調(diào)用堆棧。另外跟蹤當(dāng)前指令字節(jié)代碼,方法堆棧跟蹤本地變量,JVM傳遞給一個(gè)方法的參數(shù),以及方法的返回值。
    當(dāng)多個(gè)線程在同一個(gè)程序中執(zhí)行字節(jié)代碼序列時(shí),這種行為叫作多線程。多線程在多方面有利于程序:
    ·當(dāng)執(zhí)行其它任務(wù)時(shí)多線程GUI(圖形用戶界面)程序仍能保持對用戶的響應(yīng),比如重編頁碼或打印一個(gè)文檔。
    ·帶線程的程序一般比它們沒有帶線程的副本程序完成得快。這尤其表現(xiàn)在線程運(yùn)行在一個(gè)多處理器機(jī)器上,在這里每一個(gè)線程都有它自己的處理器。
    Java通過java.lang.Thread類完成多線程。每一個(gè)線程對象描述一個(gè)單獨(dú)的執(zhí)行線程。那些運(yùn)行發(fā)生在線程的run()方法中。因?yàn)槿笔〉膔un()方法什么都不做,你必須創(chuàng)建Thread子類并重載run()以完成有用的工作。練習(xí)列表1中領(lǐng)略一個(gè)在Thread中的線程及多線程:
    列表1. ThreadDemo.java
    // ThreadDemo.java
    class ThreadDemo
    {
    public static void main (String [] args)
    {
    MyThread mt = new MyThread ();
    mt.start ();
    for (int i = 0; i < 50; i++)
    System.out.println ("i = " + i + ", i * i = " + i * i);
    }
    }
    class MyThread extends Thread
    {
    public void run ()
    {
    for (int count = 1, row = 1; row < 20; row++, count++)
    {
    for (int i = 0; i < count; i++)
    System.out.print ('*');
    System.out.print ('\n');
    }
    }
    }
    列表1顯示了一個(gè)由類ThreadDemo和MyThread組成的應(yīng)用程序的源代碼。類ThreadDemo通過創(chuàng)建一個(gè)MyThread對象驅(qū)動(dòng)應(yīng)用程序,開始一個(gè)與其對象相關(guān)的線程并執(zhí)行一段打印一個(gè)正方形表的代碼。相反, MyThread重載Thread的run()方法打印(通過標(biāo)準(zhǔn)輸入流)一個(gè)由星形符號組成的直角三角形。
    當(dāng)你鍵入java ThreadDemo運(yùn)行應(yīng)用程序時(shí), JVM創(chuàng)建一個(gè)運(yùn)行main()方法的開始線程。通過執(zhí)行mt.start (),開始線程告訴JVM創(chuàng)建一個(gè)執(zhí)行包含MyThread對象的run()方法的字節(jié)代碼指令的第二個(gè)線程。當(dāng)start()方法返回時(shí),開始線程循環(huán)執(zhí)行打印一個(gè)正方形表,此時(shí)另一個(gè)新線程執(zhí)行run()方法打印直角三角形。
    輸出會(huì)象什么樣呢?運(yùn)行ThreadDemo就可以看到。你將注意到每一個(gè)線程的輸出與其它線程的輸出相互交替。這樣的結(jié)果是因?yàn)閮蓚€(gè)線程將它們的輸出都發(fā)送到了同樣的標(biāo)準(zhǔn)輸出流。
    注意
    多數(shù)(不是所有)JVM設(shè)備使用下層平臺的線程性能。因?yàn)槟切┬阅苁瞧脚_特有的,你的多線程程序的輸出順序可能與一些人的其他輸出的順序不一樣。這種不同是由于時(shí)序的安排,我將在這一系列的稍后探討這一話題。
    線程類
    要精通寫多線程代碼,你必須首先理解創(chuàng)建Thread類的多種方法。這部份將探討這些方法。明確地說,你將學(xué)到開始線程的方法,命名線程,使線程休眠,決定一個(gè)線程是否激活,將一個(gè)線程與另一個(gè)線程相聯(lián),和在當(dāng)前線程的線程組及子組中列舉所有激活的線程。我也會(huì)討論線程調(diào)試輔助程序及用戶線程與監(jiān)督線程的對比。
    我將在以后的文章中介紹線程方法的余下部份,Sun不贊成的方法除外。
    警告
    Sun有一些不贊成的線程方法種類,比如suspend()和resume(),因?yàn)樗鼈兡苕i住你的程序或破壞對象。所以,你不必在你的代碼中調(diào)用它們。考慮到針對這些方法工作區(qū)的SDK文件,在這篇文章中我沒有包含這些方法。
    構(gòu)造線程
    Thread有八個(gè)構(gòu)造器。最簡單的是:
    ·Thread(),用缺省名稱創(chuàng)建一個(gè)Thread對象
    ·Thread(String name),用指定的name參數(shù)的名稱創(chuàng)建一個(gè)Thread對象
    下一個(gè)最簡單的構(gòu)造器是Thread(Runnable target)和Thread(Runnable target, String name)。 除Runnable參數(shù)之外,這些構(gòu)造器與前述的構(gòu)造器一樣。不同的是:Runnable參數(shù)識別提供run()方法的線程之外的對象。(你將在這篇文章稍后學(xué)到Runnable。)最后幾個(gè)構(gòu)造器是Thread(String name),Thread(Runnable target),和Thread(Runnable target, String name)。然而,最后的構(gòu)造器包含了一個(gè)為了組織意圖的ThreadGroup參數(shù)。
    最后四個(gè)構(gòu)造器之一,Thread(ThreadGroup group, Runnable target, String name, long stackSize),令人感興趣的是它能夠讓你指定想要的線程方法調(diào)用堆棧的大小。能夠指定大小將證明在使用遞歸方法(一種為何一個(gè)方法不斷重復(fù)調(diào)用自身的技術(shù))優(yōu)美地解決一些問題的程序中是十分有幫助的。通過明確地設(shè)置堆棧大小,你有時(shí)能夠預(yù)防StackOverflowErrors。然而,太大將導(dǎo)致OutOfMemoryErrors。同樣,Sun將方法調(diào)用堆棧的大小看作平臺依賴。依賴平臺,方法調(diào)用堆棧的大小可能改變。因此,在寫調(diào)用Thread(ThreadGroup group, Runnable target, String name, long stackSize)代碼前仔細(xì)考慮你的程序分枝。
    開始你的運(yùn)載工具
    線程類似于運(yùn)載工具:它們將程序從開始移動(dòng)到結(jié)束。Thread 和Thread子類對象不是線程。它們描述一個(gè)線程的屬性,比如名稱和包含線程執(zhí)行的代碼(經(jīng)由一個(gè)run()方法)。當(dāng)一個(gè)新線程執(zhí)行run()時(shí),另一個(gè)線程正調(diào)用Thread或其子類對象的start()方法。例如,要開始第二個(gè)線程,應(yīng)用程序的開始線程—它執(zhí)行main()—調(diào)用start()。作為響應(yīng),JVM和平臺一起工作的線程操作代碼確保線程正確地初始化并調(diào)用Thread或其子類對象的run()方法。
    一旦start()完成,多重線程便運(yùn)行。因?yàn)槲覀冓呄蛴谠谝环N線性的方式中思維,我們常發(fā)現(xiàn)當(dāng)兩個(gè)或更多線程正運(yùn)行時(shí)理解并發(fā)(同時(shí))行為是困難的。因此,你應(yīng)該看看顯示與時(shí)間對比一個(gè)線程正在哪里執(zhí)行(它的位置)的圖表。下圖就是這樣一個(gè)圖表。

    與時(shí)間對比一個(gè)開始線程和一個(gè)新建線程執(zhí)行位置的行為

    圖表顯示了幾個(gè)重要的時(shí)間段:
    ·開始線程的初始化
    ·線程開始執(zhí)行main()瞬間
    ·線程開始執(zhí)行start()的瞬間
    ·start()創(chuàng)建一個(gè)新線程并返回main()的瞬間
    ·新線程的初始化
    ·新線程開始執(zhí)行run()的瞬間
    ·每個(gè)線程結(jié)束的不同瞬間
    注意新線程的初始化,它對run()的執(zhí)行,和它的結(jié)束都與開始線程的執(zhí)行同時(shí)發(fā)生。
    警告
    一個(gè)線程調(diào)用start()后,在run()方法退出前并發(fā)調(diào)用那方法將導(dǎo)致start()擲出一個(gè)java.lang.IllegalThreadStateException對象。
    主站蜘蛛池模板: 日本亚洲视频在线| 日本亚洲色大成网站www久久| 久久久久久AV无码免费网站下载| 亚洲美女人黄网成人女| 噜噜嘿在线视频免费观看| 久久久久久av无码免费看大片| 亚洲精品高清国产麻豆专区| 在线观看免费为成年视频| 九九热久久免费视频| 亚洲H在线播放在线观看H| 亚洲国产精品一区二区三区久久 | 久久精品国产亚洲AV无码麻豆| 丁香花免费高清视频完整版| 无码日韩人妻AV一区免费l | 亚洲久悠悠色悠在线播放| 亚洲欧洲久久av| 成人毛片免费播放| 中文字幕日本人妻久久久免费| 亚洲精品无码你懂的| 亚洲v高清理论电影| 亚洲AⅤ无码一区二区三区在线| 1000部禁片黄的免费看| 日韩精品无码永久免费网站| 亚洲福利一区二区| 在线A亚洲老鸭窝天堂| 国产美女无遮挡免费网站| 每天更新的免费av片在线观看| 一本到卡二卡三卡免费高| 亚洲精品无码中文久久字幕| 亚洲AV日韩AV永久无码久久| 亚洲福利在线播放| 成人毛片18女人毛片免费| 免费人成视频在线观看网站| jizz18免费视频| 精品国产亚洲第一区二区三区| 亚洲欧洲日韩综合| 国产亚洲欧洲精品| 免费一看一级毛片人| 在线免费观看一区二区三区| 中文字幕免费高清视频| 国产免费爽爽视频在线观看|