1. 程式人生 > >建立執行緒的第三種方式Callable和Future CompletionService

建立執行緒的第三種方式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()方法可以獲取其返回結果.

相關推薦

建立執行方式CallableFuture 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