最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Java創(chuàng)建線程(Runnable接口和Thread類)
大多數情況,通過實例化一個Thread對象來創(chuàng)建一個線程。Java定義了兩種方式:

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

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

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

  public void run( )


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

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

  Thread(Runnable threadOb, String threadName)


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

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

  void start( )

下面的例子是創(chuàng)建一個新的線程并啟動它運行:

// 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 構造函數中,新的Thread對象由下面的語句創(chuàng)建::

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


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

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.

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

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

// 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.");
  }
}

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

  public Thread(String threadName)


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

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

相關文章

  • 簡單學習Java+MongoDB

    簡單學習Java+MongoDB

    本文給大家介紹的是如何簡單的使用java+MongoDB實現(xiàn)數據調用的問題,非常的實用,有需要的小伙伴可以參考下
    2016-03-03
  • SpringBoot集成swagger的實例代碼

    SpringBoot集成swagger的實例代碼

    Swagger 是一款RESTFUL接口的文檔在線自動生成+功能測試功能軟件,這篇文章主要介紹了SpringBoot集成swagger,需要的朋友可以參考下
    2017-12-12
  • 手動部署java項目到k8s中的實現(xiàn)

    手動部署java項目到k8s中的實現(xiàn)

    本文主要介紹了手動部署java項目到k8s中的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Spring的@Conditional詳解

    Spring的@Conditional詳解

    這篇文章主要介紹了Spring的@Conditional詳解,給想要注入Bean增加限制條件,只有滿足限制條件才會被構造并注入到Spring的IOC容器中,通常和@Bean注解一起使用,需要的朋友可以參考下
    2024-01-01
  • Java中堆和棧的區(qū)別詳解

    Java中堆和棧的區(qū)別詳解

    這篇文章主要介紹了Java中堆和棧的區(qū)別詳解,所有的Java程序都運行在JVM虛擬機內部,我們這里介紹的自然是JVM(虛擬)內存中的堆和棧,需要的朋友可以參考下
    2015-01-01
  • JAVA實現(xiàn)打印ascii碼表代碼

    JAVA實現(xiàn)打印ascii碼表代碼

    這篇文章主要介紹了JAVA實現(xiàn)打印ascii碼表代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JDK(免安裝)各種版本下載及配置詳細圖文教程

    JDK(免安裝)各種版本下載及配置詳細圖文教程

    這篇文章主要給大家介紹了關于JDK(免安裝)各種版本下載及配置的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-07-07
  • 使用Java和PostgreSQL存儲向量數據的實現(xiàn)指南

    使用Java和PostgreSQL存儲向量數據的實現(xiàn)指南

    在當今的數字化時代,數據存儲的方式和技術正變得越來越復雜和多樣化,隨著機器學習和數據科學的發(fā)展,向量數據的存儲和管理變得尤為重要,本文將詳細介紹如何使用 Java 和 PostgreSQL 數據庫來存儲向量數據,需要的朋友可以參考下
    2024-09-09
  • 基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

    基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法

    這篇文章主要介紹了基于Nacos實現(xiàn)Spring Cloud Gateway實現(xiàn)動態(tài)路由的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • springMVC中RestTemplate傳值接值方法

    springMVC中RestTemplate傳值接值方法

    今天小編就為大家分享一篇springMVC中RestTemplate傳值接值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論

镇雄县| 大丰市| 隆昌县| 霍林郭勒市| 永昌县| 筠连县| 沐川县| 斗六市| 平舆县| 珲春市| 商南县| 长寿区| 镇江市| 衡东县| 板桥市| 通辽市| 嘉禾县| 康乐县| 杭锦旗| 徐水县| 额尔古纳市| 特克斯县| 安徽省| 铜川市| 临邑县| 清远市| 天津市| 佛教| 垣曲县| 资讯 | 通州区| 台东市| 陇西县| 曲松县| 宜兰县| 堆龙德庆县| 满城县| 周至县| 泰安市| 望江县| 册亨县|