一.通過Callable接口實現多線程
c.實現Callable重寫call方法
實現Callable和實現Runnable類似,但是功能更強大,具體表現在
a.可以在任務結束后提供一個返回值,Runnable不行
b.call方法可以拋出異常,Runnable的run方法不行
c.可以通過運行Callable得到的Fulture對象監聽目標線程調用call方法的結果,得到返回值,(fulture.get(),調用后會阻塞,直到獲取到返回值)
1.Callable接口介紹:
(1)java.util.concurrent.Callable是一個泛型接口,只有一個call()方法
(2)call()方法拋出異常Exception異常,且返回一個指定的泛型類對象
2.Callable接口實現多線程的應用場景
(1)當父線程想要獲取子線程的運行結果時
3.使用Callable接口實現多線程的步驟
(1)第一步:創建Callable子類的實例化對象
(2)第二步:創建FutureTask對象,並將Callable對象傳入FutureTask的構造方法中
(注意:FutureTask實現了Runnable接口和Future接口)
(3)第三步:實例化Thread對象,並在構造方法中傳入FurureTask對象
(4)第四步:啟動線程
例1(利用Callable接口實現線程):
利用Callable接口創建子線程類:
package com.my.frame; import java.util.concurrent.Callable; public class ThreadCall implements Callable<String> { @Override public String call() throws Exception { // TODO Auto-generated method stub System.out.println("====="); return "9999"; } }
package com.my.frame; import java.util.concurrent.FutureTask; public class TestThread { public static void main(String[] args) { FutureTask<String> ft = new FutureTask<>(new ThreadCall()); new Thread(ft).start(); } }
例2(匿名類部類實現Callable接口創建子線程):
匿名類部類實現Callable接口創建子線程類並實現:
package call; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; //匿名類部類實現Callable接口創建子線程 public class AnonyCallable { public static void main(String[] args) { Callable<String> cl = new Callable<String>() { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName() + "正在行軍~~~"); System.out.println(Thread.currentThread().getName() + "遭遇敵軍~~~"); System.out.println(Thread.currentThread().getName() + "奮勇殺敵!!!!"); return "戰斗勝利,俘虜敵軍50000人"; } }; FutureTask<String> ft = new FutureTask(cl); new Thread(ft, "李存孝部隊").start(); try { Thread.currentThread().setName("李存勖部隊"); Thread.sleep(3000); System.out.println(Thread.currentThread().getName() + "休整3000ms"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "整頓完畢,等待友軍消息..."); try { String str = ft.get(); System.out.println("李存勖部隊得知友軍消息為:" + str); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }