目錄
1.主線程等待法
2.使用Thread類的join()阻塞當前線程,等待子線程執行完畢
3.通過Callable接口實現:通過FutureTask Or線程池獲取
四、線程返回值獲取方式和Callable接口
1.主線程等待法
public class CycleWait implements Runnable{ private String value; @Override public void run() { try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } value = "we have data now"; } public static void main(String[] args) throws InterruptedException { CycleWait cw = new CycleWait(); Thread t = new Thread(cw); t.start(); while (cw.value == null){ Thread.currentThread().sleep(100); } System.out.println("value : " + cw.value); } }
2.使用Thread類的join()阻塞當前線程,等待子線程執行完畢
public class CycleWait implements Runnable{ private String value; @Override public void run() { try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } value = "we have data now"; } public static void main(String[] args) throws InterruptedException { CycleWait cw = new CycleWait(); Thread t = new Thread(cw); t.start(); t.join(); System.out.println("value : " + cw.value); } }
缺點很明顯,不夠精准,只能等子線程結束才能繼續主線程
3.通過Callable接口實現:通過FutureTask Or線程池獲取
(1)使用FutureTask獲取返回值
public class MyCallable implements Callable<String> { @Override public String call() throws Exception{ String value="test"; System.out.println("Ready to work"); Thread.currentThread().sleep(5000); System.out.println("task done"); return value; } public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> task = new FutureTask<String>(new MyCallable()); new Thread(task).start(); if(!task.isDone()){ System.out.println("task has not finished, please wait!"); } System.out.println("task return: " + task.get()); } }
(2)通過線程池獲取返回值
public class MyCallable implements Callable<String> { @Override public String call() throws Exception{ String value="test"; System.out.println("Ready to work"); Thread.currentThread().sleep(5000); System.out.println("task done"); return value; } public static void main(String[] args) { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); Future<String> future = newCachedThreadPool.submit(new MyCallable()); if(!future.isDone()){ System.out.println("task has not finished, please wait!"); } try { System.out.println(future.get()); } catch (Exception e) { e.printStackTrace(); }finally { newCachedThreadPool.shutdown(); } } }