1. 程式人生 > >Callable實現帶有返回值的執行緒

Callable實現帶有返回值的執行緒

我們都知道執行緒是沒有返回值的,在Runnable介面中,只有一個抽象的Run方法,使用Callable我們能夠實現帶有返回值得的執行緒,下面是一個demo

/**
 * 
 */
package com.mingrisoft.threadone;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Test {

       int value=100;//賬戶錢
    public static void main(String[] args) {
        // TODO Auto-generated method stub
new Test(); } public Test() { Thread thread=new Thread(new FutureTask<>(new run())); Thread thread2=new Thread(new FutureTask<>(new run1())); thread.start(); thread2.start(); } class run implements Callable<Integer>{ @Override public
Integer call() throws Exception { //在這裡實現計算 for(int i=0;i<10;i++){ value+=10; System.out.println("run一的計算結果為:"+value); } return value; } } class run1 implements Callable<Integer>{ @Override public
Integer call() throws Exception { for(int i=0;i<10;i++){ value+=10; System.out.println("run2一的計算結果為:"+value); } return value; } } }

具體就不講解嘍,大家可以檢視官方文件,現在我們來看看列印結果
這裡寫圖片描述

我們發現同時執行,執行緒2居然被阻塞了,通過著我們發現可以通過這實現非同步計算,
上面我們建立了FutureTask物件,FutureTask實現了Runnable介面
官方給出這樣的說明
可取消的非同步計算。利用開始和取消計算的方法、查詢計算是否完成的方法和獲取計算結果的方法,此類提供了對 Future 的基本實現。僅在計算完成時才能獲取結果;如果計算尚未完成,則阻塞 get 方法。一旦計算完成,就不能再重新開始或取消計算。可使用 FutureTask 包裝 Callable 或 Runnable 物件。因為 FutureTask 實現了 Runnable,所以可將 FutureTask 提交給 Executor 執行。
那麼說了,如果計算沒有完成,就會阻塞get方法,先我們來測試一下
修改程式的程式碼:

/**
 * 
 */
package com.mingrisoft.threadone;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test {

       int value=100;//賬戶錢
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    new Test();
    }

    public Test() {
        FutureTask<Integer> future=new FutureTask<>(new run());
        FutureTask<Integer> future1=new FutureTask<>(new run1());
        Thread thread=new Thread(future);
        Thread thread2=new Thread(future1);
        thread.start();
        thread2.start();

            try {
                int i=future.get();
                int j=future1.get();
                System.out.println("i的計算結果為:"+i);
                System.out.println("j的計算的結果為:"+j);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }


    class run implements Callable<Integer>{
        @Override
        public Integer call() throws Exception {
            //在這裡實現計算

            for(int i=0;i<10;i++){
                value+=10;
            //  System.out.println("run一的計算結果為:"+value);
            }
            return value;
        }

    }

    class run1 implements Callable<Integer>{

        @Override
        public Integer call() throws Exception {
            for(int i=0;i<10;i++){
                value+=10;
            //  System.out.println("run2一的計算結果為:"+value);
            }
            return value;
        }
    }

}

這裡寫圖片描述