欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

舉例講解Java中的多線程編程

 更新時(shí)間:2015年09月29日 09:32:23   投稿:goldensun  
這篇文章主要介紹了舉例講解Java中的多線程編程,線程是Java學(xué)習(xí)中的重要知識(shí),需要的朋友可以參考下

Java創(chuàng)建線程(Runnable接口和Thread類)
大多數(shù)情況,通過(guò)實(shí)例化一個(gè)Thread對(duì)象來(lái)創(chuàng)建一個(gè)線程。Java定義了兩種方式:

  1. 實(shí)現(xiàn)Runnable 接口;
  2. 可以繼承Thread類。

下面的依次介紹了每一種方式。
實(shí)現(xiàn)Runnable接口

創(chuàng)建線程的最簡(jiǎn)單的方法就是創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable 接口的類。Runnable抽象了一個(gè)執(zhí)行代碼單元。你可以通過(guò)實(shí)現(xiàn)Runnable接口的方法創(chuàng)建每一個(gè)對(duì)象的線程。為實(shí)現(xiàn)Runnable 接口,一個(gè)類僅需實(shí)現(xiàn)一個(gè)run()的簡(jiǎn)單方法,該方法聲明如下:

  public void run( )


在run()中可以定義代碼來(lái)構(gòu)建新的線程。理解下面內(nèi)容是至關(guān)重要的:run()方法能夠像主線程那樣調(diào)用其他方法,引用其他類,聲明變量。僅有的不同是run()在程序中確立另一個(gè)并發(fā)的線程執(zhí)行入口。當(dāng)run()返回時(shí),該線程結(jié)束。

在你已經(jīng)創(chuàng)建了實(shí)現(xiàn)Runnable接口的類以后,你要在類內(nèi)部實(shí)例化一個(gè)Thread類的對(duì)象。Thread 類定義了好幾種構(gòu)造函數(shù)。我們會(huì)用到的如下:

  Thread(Runnable threadOb, String threadName)


該構(gòu)造函數(shù)中,threadOb是一個(gè)實(shí)現(xiàn)Runnable接口類的實(shí)例。這定義了線程執(zhí)行的起點(diǎn)。新線程的名稱由threadName定義。

建立新的線程后,它并不運(yùn)行直到調(diào)用了它的start()方法,該方法在Thread 類中定義。本質(zhì)上,start() 執(zhí)行的是一個(gè)對(duì)run()的調(diào)用。 Start()方法聲明如下:

  void start( )

下面的例子是創(chuàng)建一個(gè)新的線程并啟動(dòng)它運(yùn)行:

// Create a second thread.
class NewThread implements Runnable {
  Thread t;
  NewThread() {
    // Create a new, second thread
    t = new Thread(this, "Demo Thread");
    System.out.println("Child thread: " + t);
    t.start(); // Start the thread
  }

  // This is the entry point for the second thread.
  public void run() {
    try {
      for(int i = 5; i > 0; i--) {
        System.out.println("Child Thread: " + i);
        Thread.sleep(500);
      }
    } catch (InterruptedException e) {
      System.out.println("Child interrupted.");
    }
    System.out.println("Exiting child thread.");
  }
}

class ThreadDemo {
  public static void main(String args[]) {
    new NewThread(); // create a new thread
    try {
      for(int i = 5; i > 0; i--) {
        System.out.println("Main Thread: " + i);
        Thread.sleep(1000);
      }
    } catch (InterruptedException e) {
      System.out.println("Main thread interrupted.");
    }
    System.out.println("Main thread exiting.");
  }
}

在NewThread 構(gòu)造函數(shù)中,新的Thread對(duì)象由下面的語(yǔ)句創(chuàng)建::

  t = new Thread(this, "Demo Thread");


通過(guò)前面的語(yǔ)句this 表明在this對(duì)象中你想要新的線程調(diào)用run()方法。然后,start() 被調(diào)用,以run()方法為開(kāi)始啟動(dòng)了線程的執(zhí)行。這使子線程for 循環(huán)開(kāi)始執(zhí)行。調(diào)用start()之后,NewThread 的構(gòu)造函數(shù)返回到main()。當(dāng)主線程被恢復(fù),它到達(dá)for 循環(huán)。兩個(gè)線程繼續(xù)運(yùn)行,共享CPU,直到它們的循環(huán)結(jié)束。該程序的輸出如下:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

如前面提到的,在多線程程序中,通常主線程必須是結(jié)束運(yùn)行的最后一個(gè)線程。實(shí)際上,一些老的JVM,如果主線程先于子線程結(jié)束,Java的運(yùn)行時(shí)間系統(tǒng)就可能“掛起”。前述程序保證了主線程最后結(jié)束,因?yàn)橹骶€程沉睡周期1000毫秒,而子線程僅為500毫秒。這就使子線程在主線程結(jié)束之前先結(jié)束。簡(jiǎn)而言之,你將看到等待線程結(jié)束的更好途徑。
擴(kuò)展Thread

創(chuàng)建線程的另一個(gè)途徑是創(chuàng)建一個(gè)新類來(lái)擴(kuò)展Thread類,然后創(chuàng)建該類的實(shí)例。當(dāng)一個(gè)類繼承Thread時(shí),它必須重載run()方法,這個(gè)run()方法是新線程的入口。它也必須調(diào)用start()方法去啟動(dòng)新線程執(zhí)行。下面用擴(kuò)展thread類重寫(xiě)前面的程序:

// Create a second thread by extending Thread
class NewThread extends Thread {
  NewThread() {
    // Create a new, second thread
    super("Demo Thread");
    System.out.println("Child thread: " + this);
    start(); // Start the thread
  }

  // This is the entry point for the second thread.
  public void run() {
    try {
      for(int i = 5; i > 0; i--) {
        System.out.println("Child Thread: " + i);
        Thread.sleep(500);
      }
    } catch (InterruptedException e) {
      System.out.println("Child interrupted.");
    }
    System.out.println("Exiting child thread.");
  }
}

class ExtendThread {
  public static void main(String args[]) {
    new NewThread(); // create a new thread
    try {
      for(int i = 5; i > 0; i--) {
        System.out.println("Main Thread: " + i);
        Thread.sleep(1000);
      }
    } catch (InterruptedException e) {
      System.out.println("Main thread interrupted.");
    }
    System.out.println("Main thread exiting.");
  }
}

該程序生成和前述版本相同的輸出。子線程是由實(shí)例化NewThread對(duì)象生成的,該對(duì)象從Thread類派生。注意NewThread 中super()的調(diào)用。該方法調(diào)用了下列形式的Thread構(gòu)造函數(shù):

  public Thread(String threadName)


這里,threadName指定線程名稱。
選擇合適方法

到這里,你一定會(huì)奇怪為什么Java有兩種創(chuàng)建子線程的方法,哪一種更好呢。所有的問(wèn)題都?xì)w于一點(diǎn)。Thread類定義了多種方法可以被派生類重載。對(duì)于所有的方法,惟一的必須被重載的是run()方法。這當(dāng)然是實(shí)現(xiàn)Runnable接口所需的同樣的方法。很多Java程序員認(rèn)為類僅在它們被加強(qiáng)或修改時(shí)應(yīng)該被擴(kuò)展。因此,如果你不重載Thread的其他方法時(shí),最好只實(shí)現(xiàn)Runnable 接口。這當(dāng)然由你決定。然而,在本章的其他部分,我們應(yīng)用實(shí)現(xiàn)runnable接口的類來(lái)創(chuàng)建線程。

相關(guān)文章

  • Java導(dǎo)出Excel統(tǒng)計(jì)報(bào)表合并單元格的方法詳解

    Java導(dǎo)出Excel統(tǒng)計(jì)報(bào)表合并單元格的方法詳解

    我們?cè)谌粘>幊踢^(guò)程中,總是會(huì)碰見(jiàn)導(dǎo)出相關(guān)表格信息的需求,所以就讓我們一起來(lái)學(xué)習(xí)一下,這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Excel統(tǒng)計(jì)報(bào)表合并單元格的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 深入了解Spring中的@Autowired和@Resource注解

    深入了解Spring中的@Autowired和@Resource注解

    Spring中的@Autowired和@Resource注解都可以實(shí)現(xiàn)依賴注入,但使用方式、注入策略和適用場(chǎng)景略有不同。本文將深入探討這兩種注解的原理、使用方法及優(yōu)缺點(diǎn),幫助讀者更好地理解和運(yùn)用Spring依賴注入機(jī)制
    2023-04-04
  • 使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢

    使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢

    這篇文章主要介紹了使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java后端WebSocket的Tomcat實(shí)現(xiàn)

    Java后端WebSocket的Tomcat實(shí)現(xiàn)

    這篇文章主要介紹了Java后端WebSocket的Tomcat實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 使用Java生成jpg與壓縮圖片為jpg文件的代碼示例

    使用Java生成jpg與壓縮圖片為jpg文件的代碼示例

    這篇文章主要介紹了使用Java生成jpg與壓縮圖片為jpg文件的代碼示例,都是對(duì)com.sun.image.codec.jpeg這個(gè)包的應(yīng)用,需要的朋友可以參考下
    2015-11-11
  • 詳解SpringBoot中5種類型參數(shù)傳遞和json數(shù)據(jù)傳參的操作

    詳解SpringBoot中5種類型參數(shù)傳遞和json數(shù)據(jù)傳參的操作

    當(dāng)涉及到參數(shù)傳遞時(shí),Spring?Boot遵循HTTP協(xié)議,并支持多種參數(shù)傳遞方式,這些參數(shù)傳遞方式可以根據(jù)請(qǐng)求的不同部分進(jìn)行分類,
    2023-12-12
  • spring-data-redis 2.0 的使用示例代碼

    spring-data-redis 2.0 的使用示例代碼

    這篇文章主要介紹了spring-data-redis 2.0 的使用示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • java單例五種實(shí)現(xiàn)模式解析

    java單例五種實(shí)現(xiàn)模式解析

    這篇文章主要介紹了java單例五種實(shí)現(xiàn)模式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java中的static和final關(guān)鍵字的使用詳解

    Java中的static和final關(guān)鍵字的使用詳解

    這篇文章主要介紹了Java中的static和final關(guān)鍵字的使用詳解,  當(dāng)方法名前有static,即為static方法,可以方便我們無(wú)需創(chuàng)建對(duì)象也可以調(diào)用此方法,靜態(tài)方法比較拉,只可以訪問(wèn) 靜態(tài)的 屬性/變量/方法,無(wú)法訪問(wèn)非靜態(tài)的這些屬性/變量/方法,需要的朋友可以參考下
    2024-01-01
  • Java并發(fā)編程(CyclicBarrier)實(shí)例詳解

    Java并發(fā)編程(CyclicBarrier)實(shí)例詳解

    這篇文章主要介紹了Java并發(fā)編程(CyclicBarrier)實(shí)例詳解的相關(guān)資料,JAVA編寫(xiě)并發(fā)程序的時(shí)候,我們需要仔細(xì)去思考一下并發(fā)流程的控制,如何讓各個(gè)線程之間協(xié)作完成某項(xiàng)工作。
    2017-07-07

最新評(píng)論