Java建立多執行緒的三種方法
Java多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。
1、繼承Thread類實現多執行緒
繼承Thread類的方法儘管被我列為一種多執行緒實現方式,但Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項,並且,啟動執行緒的唯一方法就是通過Thread類的start()例項方法。start()方法是一個native方法,它將啟動一個新執行緒,並執行run()方法。這種方式實現多執行緒很簡單,通過自己的類直接extend Thread,並複寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。例如:
- publicclass MyThread extends Thread {
- publicvoid run() {
- System.out.println("MyThread.run()");
- }
- }
- MyThread myThread1 = new MyThread();
- MyThread myThread2 = new MyThread();
- myThread1.start();
- myThread2.start();
2、實現Runnable介面方式實現多執行緒
如果自己的類已經extends另一個類,就無法直接extends Thread,此時,必須實現一個Runnable介面,如下:
- publicclass MyThread extends OtherClass implements Runnable {
- publicvoid run() {
- System.out.println("MyThread.run()");
- }
- }
- MyThread myThread = new MyThread();
- Thread thread = new Thread(myThread);
- thread.start();
- publicvoid run() {
- if (target != null) {
- target.run();
- }
- }
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下驗證過沒問題可以直接使用。程式碼如下:
- import java.util.concurrent.*;
- import java.util.Date;
- import java.util.List;
- import java.util.ArrayList;
- /**
- * 有返回值的執行緒
- */
- @SuppressWarnings("unchecked")
- publicclass Test {
- publicstaticvoid main(String[] args) throws ExecutionException,
- InterruptedException {
- System.out.println("----程式開始執行----");
- Date date1 = new Date();
- int taskSize = 5;
- // 建立一個執行緒池
- ExecutorService pool = Executors.newFixedThreadPool(taskSize);
- // 建立多個有返回值的任務
- List<Future> list = new ArrayList<Future>();
- for (int i = 0; i < taskSize; i++) {
- Callable c = new MyCallable(i + " ");
- // 執行任務並獲取Future物件
- Future f = pool.submit(c);
- // System.out.println(">>>" + f.get().toString());
- list.add(f);
- }
- // 關閉執行緒池
- pool.shutdown();
- // 獲取所有併發任務的執行結果
- for (Future f : list) {
- // 從Future物件上獲取任務的返回值,並輸出到控制檯
- System.out.println(">>>" + f.get().toString());
- }
- Date date2 = new Date();
- System.out.println("----程式結束執行----,程式執行時間【"
- + (date2.getTime() - date1.getTime()) + "毫秒】");
- }
- }
- class MyCallable implements Callable<Object> {
- private String taskNum;
- MyCallable(String taskNum) {
- this.taskNum = taskNum;
- }
- public Object call() throws Exception {
- System.out.println(">>>" + taskNum + "任務啟動");
- Date dateTmp1 = new Date();
- Thread.sleep(1000);
- Date dateTmp2 = new Date();
- long time = dateTmp2.getTime() - dateTmp1.getTime();
- System.out.println(">>>" + taskNum + "任務終止");
- return taskNum + "任務返回執行結果,當前任務時間【" + time + "毫秒】";
- }
- }
上述程式碼中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在底層就是多執行