Callable實現多線程
從最傳統來講如果要進行多線程的實現肯定要依靠的就是Runnable,但是Runnable接口有一個缺點:當線程執行完畢之後無法獲取一個返回值,所以從JDK1.5之後就提出了一個新的線程實現接口:java.util.concurrent.Callable接口,首先來觀察這個接口的定義:
可以發現Callable定義的時候可以設置一個泛型,此泛型的類型就是返回數據的類型,這樣的好處是避免向下轉型所帶來的安全隱患。
例:使用Callable實現多線程處理
class MyThread implements Callable<String> {
@Override
public String call() {
for (int x = 0; x < 10; x++) {
System.out.println("*******線程執行、x = " + x);
}
return "線程執行完畢";
}
}
public class ThreadDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> task = new FutureTask<>(new MyThread());
new Thread(task).start();;
System.out.println("線程返回數據" + task.get());
}
}
線程運行狀狀態
對於多線程的開發而言,編寫程序的過程之中總是按照:定義線程主體類,而後通過Thread類進行線程啓動,並不意味着你調用start()方法,線程就已經開始運行了,因爲整體的線程處理有自己的一套運行的狀態。
**1、**任何一個線程的對象都應該使用Thread進行封裝,所以線程的啓動使用的是start(),但是啓動的時候實際上若干個線程都將進入到一種就緒狀態,現在並沒有執行;
**2、**進入到就緒狀態之後就需要等待進行資源調度,當某一個線程調度成功之後則進入到運行狀態(run()方法),但是所有的線程不可能一直持續執行下去,中間需要產生一些暫停的狀態,例如:某個線程執行一段時間之後就需要讓出資源;而後這個線程將進入到阻塞狀態,隨後重新迴歸到就緒狀態;
**3、**當run()方法執行完畢之後,實際上該線程的主要任務也就結束了,那麼就可以直接進入到停止狀態;