1. 程式人生 > >Java建立多執行緒的三種方法

Java建立多執行緒的三種方法

Java多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。

1、繼承Thread類實現多執行緒
繼承Thread類的方法儘管被我列為一種多執行緒實現方式,但Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項,並且,啟動執行緒的唯一方法就是通過Thread類的start()例項方法。start()方法是一個native方法,它將啟動一個新執行緒,並執行run()方法。這種方式實現多執行緒很簡單,通過自己的類直接extend Thread,並複寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。例如:

  1. publicclass MyThread extends Thread {  
  2.   publicvoid run() {  
  3.    System.out.println("MyThread.run()");  
  4.   }  
  5. }  
在合適的地方啟動執行緒如下:
  1. MyThread myThread1 = new MyThread();  
  2. MyThread myThread2 = new MyThread();  
  3. myThread1.start();  
  4. myThread2.start();  

2、實現Runnable介面方式實現多執行緒
如果自己的類已經extends另一個類,就無法直接extends Thread,此時,必須實現一個Runnable介面,如下:

  1. publicclass MyThread extends OtherClass implements Runnable {  
  2.   publicvoid run() {  
  3.    System.out.println("MyThread.run()");  
  4.   }  
  5. }  
為了啟動MyThread,需要首先例項化一個Thread,並傳入自己的MyThread例項:
  1. MyThread myThread = new MyThread();  
  2. Thread thread = new Thread(myThread);  
  3. thread.start();  
事實上,當傳入一個Runnable target引數給Thread後,Thread的run()方法就會呼叫target.run(),參考JDK原始碼:

  1. publicvoid run() {  
  2.   if (target != null) {  
  3.    target.run();  
  4.   }  
  5. }  

3、使用ExecutorService、Callable、Future實現有返回結果的多執行緒
ExecutorService、Callable、Future這個物件實際上都是屬於Executor框架中的功能類。想要詳細瞭解Executor框架的可以訪問http://www.javaeye.com/topic/366591 ,這裡面對該框架做了很詳細的解釋。返回結果的執行緒是在JDK1.5中引入的新特徵,確實很實用,有了這種特徵我就不需要再為了得到返回值而大費周折了,而且即便實現了也可能漏洞百出。
可返回值的任務必須實現Callable介面,類似的,無返回值的任務必須Runnable介面。執行Callable任務後,可以獲取一個Future的物件,在該物件上呼叫get就可以獲取到Callable任務返回的Object了,再結合線程池介面ExecutorService就可以實現傳說中有返回結果的多執行緒了。下面提供了一個完整的有返回結果的多執行緒測試例子,在JDK1.5下驗證過沒問題可以直接使用。程式碼如下:
  1. import java.util.concurrent.*;  
  2. import java.util.Date;  
  3. import java.util.List;  
  4. import java.util.ArrayList;  
  5. /** 
  6. * 有返回值的執行緒 
  7. */
  8. @SuppressWarnings("unchecked")  
  9. publicclass Test {  
  10. publicstaticvoid main(String[] args) throws ExecutionException,  
  11.     InterruptedException {  
  12.    System.out.println("----程式開始執行----");  
  13.    Date date1 = new Date();  
  14.    int taskSize = 5;  
  15.    // 建立一個執行緒池
  16.    ExecutorService pool = Executors.newFixedThreadPool(taskSize);  
  17.    // 建立多個有返回值的任務
  18.    List<Future> list = new ArrayList<Future>();  
  19.    for (int i = 0; i < taskSize; i++) {  
  20.     Callable c = new MyCallable(i + " ");  
  21.     // 執行任務並獲取Future物件
  22.     Future f = pool.submit(c);  
  23.     // System.out.println(">>>" + f.get().toString());
  24.     list.add(f);  
  25.    }  
  26.    // 關閉執行緒池
  27.    pool.shutdown();  
  28.    // 獲取所有併發任務的執行結果
  29.    for (Future f : list) {  
  30.     // 從Future物件上獲取任務的返回值,並輸出到控制檯
  31.     System.out.println(">>>" + f.get().toString());  
  32.    }  
  33.    Date date2 = new Date();  
  34.    System.out.println("----程式結束執行----,程式執行時間【"
  35.      + (date2.getTime() - date1.getTime()) + "毫秒】");  
  36. }  
  37. }  
  38. class MyCallable implements Callable<Object> {  
  39. private String taskNum;  
  40. MyCallable(String taskNum) {  
  41.    this.taskNum = taskNum;  
  42. }  
  43. public Object call() throws Exception {  
  44.    System.out.println(">>>" + taskNum + "任務啟動");  
  45.    Date dateTmp1 = new Date();  
  46.    Thread.sleep(1000);  
  47.    Date dateTmp2 = new Date();  
  48.    long time = dateTmp2.getTime() - dateTmp1.getTime();  
  49.    System.out.println(">>>" + taskNum + "任務終止");  
  50.    return taskNum + "任務返回執行結果,當前任務時間【" + time + "毫秒】";  
  51. }  
  52. }  
程式碼說明:
上述程式碼中Executors類,提供了一系列工廠方法用於創先執行緒池,返回的執行緒池都實現了ExecutorService介面。
public static ExecutorService newFixedThreadPool(int nThreads) 
建立固定數目執行緒的執行緒池。
public static ExecutorService newCachedThreadPool() 
建立一個可快取的執行緒池,呼叫execute 將重用以前構造的執行緒(如果執行緒可用)。如果現有執行緒沒有可用的,則建立一個新執行緒並新增到池中。終止並從快取中移除那些已有 60 秒鐘未被使用的執行緒。
public static ExecutorService newSingleThreadExecutor() 
建立一個單執行緒化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 
建立一個支援定時及週期性的任務執行的執行緒池,多數情況下可用來替代Timer類。

ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor後臺執行緒池還沒有完成Callable的計算,這呼叫返回Future物件的get()方法,會阻塞直到計算完成。

相關推薦

Java建立執行方法

Java多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。1、繼承Thread類實現多執行緒

Java建立執行方式

Java實現多執行緒主要有3種方式。 第一、直接繼承Thread類,重寫run()方法; 第二、實現Runnable介面,實現run()方法。與直接繼承Thread相比,這種方法更利於多個執行緒對共享資源的使用; 第三、實現Callable介面,實現call方法,與實現Ru

一、執行基礎概念、實現執行方法、中斷執行方法,以及執行狀態轉化

1、CPU核心數和執行緒數的關係 1:1的關係,引入超執行緒之後,就是1:2 2、cpu時間輪轉機制,即RR排程 3、程序和執行緒 程序:程式執行資源分配最小單位,程序內部有多個執行緒,多個執行緒之間會共享程序資源 執行緒:CPU排程的最小單位 4、並行和併發

Java建立執行的四方式

在進行講解執行緒的建立方式之前,首先了解下什麼是程序,什麼是執行緒,程序與執行緒之間的關係等 什麼是程序? 其實當一個程式進入記憶體執行時,就是一個程序,程序是處於執行中的程式,並且具有一定的獨立功能,程序是系統進行資源分配和排程的一個獨立單位,具有獨立性,動態性,併發性,這裡的獨立性指的是在系統中獨立存在,

Java 建立執行

1、繼承java.lang.Thread方式 執行start方法:MyThread的run就會被執行 程式碼片段: import java.util.Scanner; public class Main { public static void main(String[] a

java建立執行&建立程序

概述 併發和並行是即相似又有區別: 並行:指兩個或多個事件在同一時刻發生; 併發:指兩個或多個事件在同一時間段內發生。 程序是指一個記憶體中執行中的應用程式。每個程序都有自己獨立的一塊記憶體空間,一個應用程式可以同時啟動多個程序。比如在Windows系統中,一個執行的abc.exe就是一個程序。 那麼我們

IO複用、程序和執行併發程式設計模型比較

 I/O複用模型 I/O複用原理:讓應用程式可以同時對多個I/O埠進行監控以判斷其上的操作是否可以進行,達到時間複用的目的。在書上看到一個例子來解釋I/O的原理,我覺得很形象,如果用監控來自10根不同地方的水管(I/O埠)是否有水流到達(即是否可讀),那麼需要10個人(

IO複用、程序和執行併發程式設計模型

I/O複用模型 I/O複用原理:讓應用程式可以同時對多個I/O埠進行監控以判斷其上的操作是否可以進行,達到時間複用的目的。在書上看到一個例子來解釋I/O的原理,我覺得很形象,如果用監控來自10根不同地方的水管(I/O埠)是否有水流到達(即是否可讀),那麼需要10個人(即10

java執行中傳遞引數的方法詳細介紹

在傳統的同步開發模式下,當我們呼叫一個函式時,通過這個函式的引數將資料傳入,並通過這個函式的返回值來返回最終的計算結果。但在多執行緒的非同步開發模式下,資料的傳遞和返回和同步開發模式有很大的區別。由於執行緒的執行和結束是不可預料的,因此,在傳遞和返回資料時就無法象函式一樣通過

Java方式建立執行

通過整合Thread類實現多執行緒 package TreadLearning; /** * 建立執行緒方法1 * 利用繼承Thread類+重寫run方法 * new物件然後呼叫start()方法(不能直接呼叫run方法) * @author 袁盛桐 * */

建立執行的兩方法

建立執行緒的方法: 一種方法是將類宣告為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。接下來可以分配並啟動該子類的例項。 public class MyThread extends Thread{

Java 實現執行Thread Runnable Callable 方式

Java 多執行緒 java 實現 多執行緒 三種方法 1. 繼承Thread重寫 run方法。 2.實現Runnable的run方法。無返回值。一個類可以實現多個介面。 3.實現Callable的call方法。有返回值,可以丟擲執行緒錯誤。一個類可以實現多個介面。 public class

Java基礎執行執行安全-同步鎖形式

首先,我們通過一個案例,演示執行緒的安全問題: 電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “葫蘆娃大戰奧特曼”,本次電影的座位共100個(本場電影只能賣100張票)。我們來模擬電影院的售票視窗,實現多個視窗同時賣 “終結者”這場電影票(多個視窗一起賣這100張票)需要視窗

[Java][實現執行方式]

目錄 本系列學習筆記簡介 多執行緒的繼承Thread類實現 程序執行緒簡介 多執行緒賣票介紹 程式碼塊 錯誤程式碼塊 正確程式碼塊

建立執行方式

執行緒是指程序內部同時做的事情,比如在玩王者榮耀的時候,你可以同時攻擊英雄A和英雄B; 下面將此作為例子,引入三種建立多執行緒的方式; 例子思路:                  ①先建立英雄類(Hero)設定三個屬性:name(英雄名)、hp(英雄的血量)、dama

JAVA 建立一個執行方式

建立多執行緒-實現Runnable介面 建立類Battle,實現Runnable介面 啟動的時候,首先建立一個Battle物件,然後再根據該battle物件建立一個執行緒物件,並啟動   Battle battle1 = new Battle(gareen,teemo); new Thread(battle1

java建立一個執行的兩方法及區別

第一種方法:繼承Thread類 public class NewThread extends Thread { public void run() { for(int i=0;i<20;i++) { System.out.println(i); } } }

Java執行 - 建立方法

多執行緒的理解 可以理解成程序中獨立執行的子任務,比如QQ.exe執行時的視訊聊天執行緒,下載檔案執行緒,傳送表情執行緒等,這些不同的任務或功能可以“同時”執行。實際上,CPU在這些執行緒之間不斷的切換,這樣做可以最大限度的利用CPU的空閒時間。 Java多執行緒的建立和使用 j

Java執行3實現方法

Java中的多執行緒有三種實現方式:1.繼承Thread類,重寫run方法。Thread本質上也是一個實現了Runnable的例項,他代表一個執行緒的例項,並且啟動執行緒的唯一方法就是通過Thread類的start方法。2.實現Runnable介面,並實現該介面的run()

JAVA執行概念及其幾實現方法優劣分析

1. 多執行緒 程式:指令集,靜態的概念 程序:作業系統調動程式,是程式的一次動態執行過程,動態的概念 執行緒:在程序內的多條執行路徑 Ps:單核的話程序都是虛擬模擬出來的,多核處理器才可以執行真正的多執行緒 單核通過CPU排程時間片實現虛擬模擬的多執行緒,比如執行main函式和GC在底層就是多執行