建立執行緒的第三種方式Callable和Future CompletionService
前面已經指出通過實現Runnable時,Thread類的作用就是將run()方法包裝成執行緒執行體,那麼是否可以直接把任意方法都包裝成執行緒執行體呢?Java目前不行,但其模仿者C#中是可以的.
Callabel介面可以看成是Runnable介面的增強版,只不過其執行緒執行體call()方法比run方法更加強大罷了:
>>call()方法中可以有返回值
>>call()方法中可以宣告丟擲異常.
一.建立執行緒的第三種方式----使用Callable物件進行建立
package com.amos.concurrent; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @ClassName: CallableAndFuture * @Description: 多執行緒中的Callable和Future學習 * @author: amosli * @email:[email protected] * @date Apr 22, 2014 12:07:26 AM*/ public class CallableAndFuture { public static void main(String[] args) throws Exception, ExecutionException { ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); Future<String> future = newSingleThreadExecutor.submit(new Callable<String>() {public String call() throws Exception { Thread.sleep(20); return "hi,amos"; } }); // System.out.println("future:"+future.get(1,TimeUnit.MILLISECONDS));//等待指定的時間 System.out.println("future:" + future.get()); } }
效果如下:
注:
1.這裡要注意的是,建立執行緒時執行任務不是用execute()方法去執行了,而是用submit()方法.
2.同時要注意,這裡call()方法返回值,要和上面的保持一致.
3.另外,可以設定最大等待時間,就是等待程式的返回值,這裡使用get()方法.
4.其常用的其它方法有cancel(),isCancelled(),isDone(),分別表示取消關聯的任務,是否已經取消,任務是否已經完成.
二.CompeltionService
CompeltionService主要用於提交一組Callable物件,其take方法用於返回已完成的callable任務的Future物件.可以用麥子收割來作比喻,種了10畝地的麥子,哪一塊先成熟先收割哪一塊.
舉例:
package com.amos.concurrent; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CallableAndFuture { public static void main(String[] args) throws Exception, ExecutionException { ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10); CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(newFixedThreadPool); for(int i=0;i<11;i++){//建立10個任務 final int task=i; completionService.submit(new Callable<Integer>() {//提交任務 public Integer call() throws Exception { Thread.sleep(new Random().nextInt(3000));//最多3秒 return task; } }); } //take for(int i=0;i<11;i++){ System.out.println("已完成的任務:"+completionService.take().get()); } }
效果如下圖所示:
注:由結果也可以看出來,其隨機結果是根據任務的先後完成順序來的,使用其take()方法可以獲取其返回結果.
相關推薦
建立執行緒的第三種方式Callable和Future CompletionService
前面已經指出通過實現Runnable時,Thread類的作用就是將run()方法包裝成執行緒執行體,那麼是否可以直接把任意方法都包裝成執行緒執行體呢?Java目前不行,但其模仿者C#中是可以的. Callabel介面可以看成是Runnable介面的增強版,只不過其執行緒
C++ STL 建立執行緒的三種方式
使用 stl thread 編寫多執行緒程式時,編譯需要加 -pthread 通過函式指標建立執行緒 #include <iostream> #include <thread> using namespace std; void func(int id
java多執行緒(二):建立執行緒的三種方式以及優缺點總結
一、Java中建立執行緒主要有三種方式: 1、繼承Thread類建立執行緒類 步驟: (1)定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物件。
Java建立執行緒的三種方式
繼承Thread (1)定義Thread類的子類,重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物件。 (3)呼叫執行緒物件的start()方法來啟動該執行緒。
Java多執行緒-----建立執行緒的三種方式
1.繼承Thread類建立執行緒 定義Thread類的子類,並重寫該類的run()方法,該方法的方法體就是執行緒需要完成的任務,run()方法也稱為執行緒執行體 建立Thread子類的例項,也就是建立了執行緒物件 啟動執行緒,即呼叫執行緒的start()方法
建立執行緒的三種方式和區別
Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)使用Callable和Future建立執行緒 下面讓我們分別來看看這三種建立執行緒的方法。
Java建立執行緒的三種方式以及優劣對比
Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或者其子類例項。每個執行緒的作用是完成一定的任務,實際上是執行一段程式流 #1. 繼承Thread類建立執行緒類 通過繼承Thread類來建立並啟動多執行緒的步驟如下: 定
Java建立執行緒的三種方式及其對比
Java中建立執行緒主要有三種方式: 一、繼承Thread類建立執行緒類 (1)定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物
Java 建立執行緒的三種方式及其對比
Java中建立執行緒主要有三種方式: 一、繼承Thread類建立執行緒類 (1)定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物件。 (3)呼
併發程式設計學習總結(一) :java 建立執行緒的三種方式的優缺點和例項
java 建立執行緒有三種方式: (一) 實現Runnable介面 優點:(1) 建立執行緒的同時可以繼承其他的類,從而可以擴充套件類的功能。
java多執行緒之建立執行緒的三種方式優缺點
Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。 一、繼承Thread類建立執行緒類 1.重寫run方法。該run()方法的方法體就代表了執行緒需要完成的任務。 2.建立Thread子類的例項。 3.呼叫執行緒物件的st
多執行緒學習(一)——建立執行緒的三種方式及比較
最近在學習多執行緒,在這裡總結一下學習到的內容(參考《瘋狂Java講義第3版》):一、建立執行緒有三種方式: 1、繼承Thread類 2、實現Runnable介面 3、使用Callable和Future二、分別介紹用法:繼承Thread類/*下面
詳解及對比建立執行緒的三種方式
一.Java建立執行緒的三種方式 Java中建立執行緒主要有三種方式: 1.繼承Thread類 2.實現Runnable介
【併發那些事 】建立執行緒的三種方式
建立執行緒可以說是併發知識中最基礎的操作了,JDK 提供的建立執行緒的方式,如果不包括通過執行緒池的話,目前有三種形式,它們分別是通過繼承 Thread 類,通過實現 Runable 介面,通過 FutureTask。如下圖所示 下面整理了一下 3 種方法的具體使用與異同。 建立執行緒的 3 種方法
Java建立一個多執行緒的三種方式
步驟一:執行緒概念 首先要理解程序(Processor)和執行緒(Thread)的區別 程序:啟動一個LOL.exe就叫一個程序。 接著又啟動一個DOTA.exe,這叫兩個程序。 執行緒:執行緒是在程序內部同時做的事情,比如在LOL裡,有很多事情要同時做,比如"蓋倫” 擊殺“
建立多執行緒的三種方式
執行緒是指程序內部同時做的事情,比如在玩王者榮耀的時候,你可以同時攻擊英雄A和英雄B; 下面將此作為例子,引入三種建立多執行緒的方式; 例子思路: ①先建立英雄類(Hero)設定三個屬性:name(英雄名)、hp(英雄的血量)、dama
JAVA 建立一個執行緒的三種方式
建立多執行緒-實現Runnable介面 建立類Battle,實現Runnable介面 啟動的時候,首先建立一個Battle物件,然後再根據該battle物件建立一個執行緒物件,並啟動 Battle battle1 = new Battle(gareen,teemo); new Thread(battle1
Java第十三天學習筆記~多執行緒(執行緒的狀態、建立執行緒的第二種方式、同步程式碼塊、同步函式)
多執行緒 執行緒的狀態 CPU的執行資格:可以被C
Java建立多執行緒的三種方式
Java實現多執行緒主要有3種方式。 第一、直接繼承Thread類,重寫run()方法; 第二、實現Runnable介面,實現run()方法。與直接繼承Thread相比,這種方法更利於多個執行緒對共享資源的使用; 第三、實現Callable介面,實現call方法,與實現Ru
OC開執行緒的三種方式
第一種NSThread //NSThread 方法1 需要手動start]; NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@select