西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)java → Java多線程列子

Java多線程列子

前往專題相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:本站整理時(shí)間:2010/11/17 11:36:30字體大。A-A+

作者:佚名點(diǎn)擊:214次評(píng)論:0次標(biāo)簽: Java

  • 類型:行業(yè)軟件大小:7.3M語言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

到這里我們做一個(gè)完整的例子來說明線程產(chǎn)生的方式不同而生成的線程的區(qū)別:

package debug;

import java.io.*;
import java.lang.Thread;

class MyThread extends Thread{
  public int x = 0;

  public void run(){
    System.out.println(++x);
  }
}

class R implements Runnable{
  private int x = 0;
  public void run(){
    System.out.println(++x);
  }
}

public class Test {
  public static void main(String[] args) throws Exception{
   
    for(int i=0;i<10;i++){
      Thread t = new MyThread();
      t.start();
    }
    Thread.sleep(10000);//讓上面的線程運(yùn)行完成
    R r = new R();
    for(int i=0;i<10;i++){
      Thread t = new Thread(r);
      t.start();
    }
  }
}  上面10個(gè)線程對(duì)象產(chǎn)生的10個(gè)線程運(yùn)行時(shí)打印了10次1。下面10個(gè)線程對(duì)象產(chǎn)生的10個(gè)線程運(yùn)行時(shí)打印了1到10。我們把下面的10個(gè)線程稱為同一實(shí)例(Runnable實(shí)例)的多個(gè)線程 。

  下節(jié)我們將研究線程對(duì)象方法,還是那句話,一般文檔中可以讀到的內(nèi)容我不會(huì)介紹太多
請(qǐng)大家自己了解。

線程對(duì)象的幾個(gè)重要的方法

  盡管線程對(duì)象的常用方法可以通過API文檔來了解,但是有很多方法僅僅從API說明是無法詳細(xì)了解的。

  本來打算用一節(jié)的篇幅來把線程方法中一些重要的知識(shí)說完,但這樣下來估計(jì)要很常的篇幅,可能要用好幾節(jié)才能說把和線程方法相關(guān)的一些重要的知識(shí)說完。

  首先我們接基礎(chǔ)篇(二)來說明start()方法。

  一個(gè)線程對(duì)象生成后,如果要產(chǎn)生一個(gè)執(zhí)行的線程,就一定要調(diào)用它的start()方法.在介紹這個(gè)方法時(shí)不得不同時(shí)說明run方法.其實(shí)線程對(duì)象的run方法完全是一個(gè)接口回調(diào)方法,它是你這個(gè)線程對(duì)象要完成的具體邏輯.簡(jiǎn)單說你要做什么就你在run中完成,而如何做,什么時(shí)候做就不需要你控制了,你只要調(diào)用start()方法,JVM就會(huì)管理這個(gè)線程對(duì)象讓它產(chǎn)生一個(gè)線程并注冊(cè)到線程處理系統(tǒng)中。

  從表面上看,start()方法調(diào)用了run()方法,事實(shí)上,start()方法并沒有直接調(diào)用run方法.在JDK1.5以前 start()方法是本地方法,它如何最終調(diào)用run方法已經(jīng)不是JAVA程序員所能了解的.而在JDK1.5中,原來的那個(gè)本地start()方法被 start0()代替,另個(gè)一個(gè)純JAVA的start()中調(diào)用本地方法start0(),而在start()方法中做了一個(gè)驗(yàn)證,就是對(duì)一個(gè)全局變量 (對(duì)象變量)started做檢驗(yàn),如果為true,則start()拋出異常,不會(huì)調(diào)用本地方法start0(),否則,先將該變量設(shè)有true,然后調(diào)用start0()。

  從中我們可以看到這個(gè)為了控制一個(gè)線程對(duì)象只能運(yùn)行成功一次start()方法.這是因?yàn)榫程的運(yùn)行要獲取當(dāng)前環(huán)境,包括安全,父線程的權(quán)限, 優(yōu)先級(jí)等條件,如果一個(gè)線程對(duì)象可以運(yùn)行多次,那么定義一個(gè)static 的線程在一個(gè)環(huán)境中獲取相應(yīng)權(quán)限和優(yōu)先級(jí),運(yùn)行完成后它在另一個(gè)環(huán)境中利用原來的權(quán)限和優(yōu)先級(jí)等屬性在當(dāng)前環(huán)境中運(yùn)行,這樣就造成無法預(yù)知的結(jié)果.簡(jiǎn)單說來,讓一個(gè)線程對(duì)象只能成功運(yùn)行一次,是基于對(duì)線程管理的需要。

start()方法最本質(zhì)的功能是從CPU中申請(qǐng)另一個(gè)線程空間來執(zhí)行 run()方法中的代碼,它和當(dāng)前的線程是兩條線,在相對(duì)獨(dú)立的線程空間運(yùn)行,也就是說,如果你直接調(diào)用線程對(duì)象的run()方法,當(dāng)然也會(huì)執(zhí)行,但那是在當(dāng)前線程中執(zhí)行,run()方法執(zhí)行完成后繼續(xù)執(zhí)行下面的代碼.而調(diào)用start()方法后,run()方法的代碼會(huì)和當(dāng)前線程并發(fā)(單CPU)或并行 (多CPU)執(zhí)行。

  所以請(qǐng)記住一句話[調(diào)用線程對(duì)象的run方法不會(huì)產(chǎn)生一個(gè)新的線程],雖然可以達(dá)到相同的執(zhí)行結(jié)果,但執(zhí)行過程和執(zhí)行效率不同。

  [線程的interrupt()方法,interrupted()和isInterrupted()]

  這三個(gè)方法是關(guān)系非常密切而且又比較復(fù)雜的,雖然它們各自的功能很清楚,但它們之間的關(guān)系有大多數(shù)人不是真正的了解。

  先說interrupt()方法,它是實(shí)例方法,而它也是最奇怪的方法,在java語言中,線程最初被設(shè)計(jì)為"隱晦難懂"的東西,直到現(xiàn)在它的語義不沒有象它的名字那樣準(zhǔn)確。大多數(shù)人以為,一個(gè)線程象調(diào)用了interrupt()方法,那它對(duì)應(yīng)的線程就應(yīng)該被中斷而拋出異常,事實(shí)中,當(dāng)一個(gè)線程對(duì)象調(diào)用interrupt()方法,它對(duì)應(yīng)的線程并沒有被中斷,只是改變了它的中斷狀態(tài)。

  使當(dāng)前線程的狀態(tài)變以中斷狀態(tài),如果沒有其它影響,線程還會(huì)自己繼續(xù)執(zhí)行。

  只有當(dāng)線程執(zhí)行到sleep,wait,join等方法時(shí),或者自己檢查中斷狀態(tài)而拋出異常的情況下,線程才會(huì)拋出異常。

    PPT圖表
    (111)PPT圖表
    我們?cè)谥谱鞲黝惖臅r(shí)候,或多或少的都能用到圖表。圖表它可以直觀的展示出各種信息數(shù)據(jù),有了圖表你就可以很好的將數(shù)據(jù)更直觀準(zhǔn)確的表達(dá)出來。小編在這里為大家搜集整理了一些大家可能會(huì)用到的圖表模板,歡迎有需要的各位前來下載。...更多>>

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)