1、可以有返回值
2、可以丟擲異常
3、方法不同,run()/ call()
程式碼測試
package com.hudu.demo01.callable;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// new Thread(new MyThread()).start(); 類實現Runnable()介面
// new Thread(new Runnable()).start();
// new Thread(new FutureTask<V>()).start();//和上面等價,FutureTask是Runnable的實現類
// new Thread(new FutureTask<V>(Callable)).start();//FutureTask又一個構造方法,引數是傳入一個Callable
// new Thread().start();//怎麼啟動Callable
MyThread thread = new MyThread();
//適配類
FutureTask futureTask = new FutureTask(thread);
new Thread(futureTask,"A").start();
new Thread(futureTask,"B").start();//結果會被快取,提高效率
Integer o = (Integer)futureTask.get();//獲取Callable的返回結果,這個get方法會產生阻塞!把它放到最後
//或者使用非同步通訊處理
System.out.println(o);
}
}
//class MyThread implements Runnable{
//
// @Override
// public void run() {
//
// }
//}
class MyThread implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("call()");//會列印幾個call
return 12345;
}
}
細節:
1、有快取
2、結果可能需要等待,會阻塞
本作品採用《CC 協議》,轉載必須註明作者和本文連結