005 創建線程的問題
阿新 • • 發佈:2018-05-01
就是 extends get 創建線程 lte 創建ca == star 方法
一 . 概述
我們在創建線程的過程中是通過重寫run()方法來實現的.
我們可以看到run()方法的聲明:
public void run() ;
在上面的方法聲明之中有兩個缺陷:
[1]該方法沒有返回值
[2]該方法沒有異常聲明
上面說的問題也可以說是傳統創建線程的缺陷.
二 .問題的解決
在jdk1.5之前,我們需要解決上面的缺陷需要自己使用一些技巧來完成.
在jdk1,5之後,出現了一個新的方式來創建線程.
通過這種方式,我們可以解決上述的問題.
三 .例子
首先查看一個接口:
@FunctionalInterface public interfaceCallable<V> { V call() throws Exception; }
我們可以看到這個這個接口是有返回值的,而且是有異常聲明的.
然後我們再看下面的一個類:
public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
我們發現FutrueTask是Runnable的子類.
那也就是說我們可以通過這樣的方式來創建一個帶返回值的線程執行單元,並且可以聲明異常.
public class CallTest { public static void main(String[] args) { //創建Callable接口的對象 Callable<Integer> call = new Callable<Integer>() { @Override public Integer call() throws Exception { for(int i = 0; i<100 ;i++) { System.out.println(i +" thread running ..."); } return 100; } }; //創建FutureTask對象 FutureTask<Integer> task = new FutureTask<>(call); new Thread(task).start(); } }
我們可以認為Callable接口是一個Runnable接口的變種,等價於run()方法.
四 .獲取返回值
我們可以通過FutureTask對象來獲取返回值.
加工上述的代碼:
public static void main(String[] args) { //創建Callable接口的對象 Callable<Integer> call = new Callable<Integer>() { @Override public Integer call() throws Exception { for(int i = 0; i<100 ;i++) { System.out.println(i +" thread running ..."); } return 100; } }; //創建FutureTask對象 FutureTask<Integer> task = new FutureTask<>(call); new Thread(task).start(); System.out.println("主線程在運行....."); try { System.out.println("result == " + task.get()); } catch (Exception e) { e.printStackTrace(); } }
我們通過紅色的部分來完成返回值的獲取了.
其實現在有了一個疑問了,那就是主線程怎麽知道結果何時會返回呢?
這個疑問在後面會解釋清楚的.
005 創建線程的問題