在線幫助文檔:https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Callable.html
傳統實現多線程一般依靠Runnable,但是Runnable接口有一個缺點:當線程執行完以後無法獲取一個返回值。所以從JDK 1.5之後提出了一個新的線程實現接口:java.util.consurrent.Callable接口
接口定義:
@FunctionalInterface
public interface Callable<V>{
public V call() throws Exception;
}
Callable和Thread類沒有直接的關係,Callable的對象必須先封裝到FutureTask中,然後在通過FutureTask傳給Thread類,這樣才能啓動多線程
範例:使用Callable實現多線程處理
package threads;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyThread implements Callable<String>{ // 線程的主體類
@Override
public String call() throws Exception { // 多線程要執行的功能應該在run()方法中進行定義
for(int i = 0; i < 10; i++) {
System.out.println("賣票,ticket = " + i);
}
return "線程執行完畢";
}
}
public class Main {
public static void main(String[] args) throws Exception {
FutureTask<String> task = new FutureTask<>(new MyThread());
new Thread(task).start();
System.out.println("[線程返回數據]: " + task.get());
}
}
請解釋Runnable與Callable的區別?
- Runnable是JDK 1.0的時候提出的多線程實現接口,而Callable是在JDK 1.5之後提出的。
- java.lang.Runnable接口中只提供有一個run()方法,並且沒有返回值。
- java.util.concurrent.Callable接口提供有call()方法,可以有返回值。