Callable和runnable的區別

1、是否有返回值

2、是否需要泛型

3、是否拋異常

4、落地方法不一樣,一個是run,一個是call

 //創建新類MyThread實現runnable接口
class MyThread implements Runnable{
 @Override
 public void run() {
 
 }
}
//新類MyThread2實現callable接口
class MyThread2 implements Callable<Integer>{
 @Override
 public Integer call() throws Exception {
  return 200;
 } 
}

如果需要對10個線程,找到哪個線程出錯了,用runnable就無法實現,因爲沒有返回值。如果有callable接口,又出現了一個問題:thread構造方法根本沒有callable對象,只能傳進去一個runnable對象。怎麼辦呢?需要一個runnable對象去和callable對象建立聯繫,根據java的多態性(一個類可以實現多個接口)。

這個中間人就是FutureTask。

Runnable有一個子接口RunableFuture<V>

RunableFuture<V>有一個實現類FutureTask。

所以FutureTask實現了runnable接口。

package main.test;

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

/**
 * @Auther: wdq
 * @Date: 2020/4/20 14:12
 * @Description:
 */
class MyCallable implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("come in Mycallable");
        return "Mycallable is Error";
    }
}
public class Callable_futrue {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new MyCallable());

        new Thread(futureTask,"A").start();

        System.out.println(futureTask.get());
    }
}

get方法一定要再最後(先做容易題,後做難題)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章