並發編程使我們可以將程序分為很多個分離的,相互之間獨立的任務,通過使用多線程的機制,將每個任務都會有一個執行線程來單獨的驅動,一個線程是 進程中一個單一順序控制流,一個進程可以擁有多個線程,也就相當於有多個單獨的順序控制流,所以你的進程當中每個線程看起來都是有單獨的cpu一樣,底層實現就是切分cpu的時間片。
實現線程的方法
1 直接繼承Thread類 然后重寫run方法 局限性特別大 因為 任何一個類都只能繼承一個父類 繼承了線程 不可以繼承其他類
2 繼承Runnable 接口 重寫run方法 r然后將 這個類的實例 當作參數傳給Thread的構造器 創建線程這種方法 優於上面的方法 接口可以繼承任意數量
但是上述兩種方式 都有一個缺點那就是線程執行后是沒有返回值的
為了實現在線程執行后 返回結果集 引進一種新的方式 實現Callable接口
實現Callable接口 實現了 會返回結果 可以在從線程執行的時候使用funture 來接收返回值!
下面是實現線程的代碼
package test.link.thread;
import java.util.concurrent.Callable;
/**
* Callable<T> T的類型就是你要返回對象的類型!
* @author Administrator
*
*/
class TaskWithResult implements Callable<String> {
private static int num;
private int id;
public TaskWithResult() {
id = num++;
System.out.println("線程#"+id+"開始初始化");
}
@Override
public String call() throws Exception {
for(int i=0;i<3;i++){
System.out.println("call ing...");
}
System.out.println("線程#"+id+"即將結束");
return "Results of Task: "+id;
}
}
下面是如何接收線程返回值的代碼
package test.link.thread; import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Demo { public static void main(String[] args) { ExecutorService exc = Executors.newCachedThreadPool(); ArrayList<Future<String>> res = new ArrayList<Future<String>>(); res.add(exc.submit(new TaskWithResult())); for(Future<String > r: res){ try { System.out.println(r.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { exc.shutdown(); } } } }
