程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java創建線程的第三種方式Callable和Future CompletionService

java創建線程的第三種方式Callable和Future CompletionService

編輯:關於JAVA

前面已經指出通過實現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()方法可以獲取其返回結果.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved