Java多執行緒之執行緒返回值
阿新 • • 發佈:2018-12-21
對於Java多執行緒的理解,我以前僅僅侷限於實現Runnable介面或者繼承Thread類,然後重寫run()方法,最後start()呼叫就算完事,但是一旦涉及死鎖以及對共享資源的訪問和隨時監控執行緒的狀態和執行順序等等就不行了,所以現在開始看Thinking in java的併發這一節,從頭學多執行緒,
下面發一個關於執行緒中的任務返回,和建立執行緒池的程式碼
package com.bird.thinking;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @use 使用Executor顯示的建立Thread物件 * @author Bird * */class LiftOff implements Runnable{//建立一個類實現Runable介面 protected int countDown = 10; private static int taskCount = 0; private final int id = taskCount++; public LiftOff(){} public LiftOff(int countDown){ this.countDown = countDown; } public String status(){ return "#"+id+"("+(countDown > 0 ? countDown : "Liftoff !" + ")"); } public void run(){ while(countDown-- > 0){ System.out.println(status()); Thread.yield(); } }}public class CachedThreadPool { public static void main(String[] args){ ExecutorService exec = Executors.newCachedThreadPool();//建立執行緒池 for(int i = 0; i < 5; i++){ exec.execute(new LiftOff());//進行工作 } exec.shutdown(); }}
Executor為執行器,將為你管理Thread物件,從而簡化了併發編
程。Executor在客戶端和任務執行之間提供了一個間接層,與客戶
端直接執行任務不同,這個中介物件將執行任務。Executor允許你
管理非同步任務的執行,而無需顯示的管理執行緒的生命週期。
Executor是Java SE6/7中啟動任務的優選方法。
下面的程式碼就能夠隨時監控各個執行緒的狀態了
package com.bird.thinking;import java.util.ArrayList;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * @use 建立從任務中返回值的多執行緒,可以判斷他的狀態 * @author Bird * */class TaskWithResult implements Callable<String>{//實現這個介面,呼叫的是call()方法 private int id; public TaskWithResult(int id){ this.id = id; } public String call(){ return "result of TaskWithResult" + id; }}public class CallableDemo { public static void main(String[] args){ ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for(int i = 0; i < 10; i++){ results.add(exec.submit(new TaskWithResult(i))); } for(Future<String> fs : results){ try{ System.out.println(fs.get());//可以呼叫很多方法,包括是否工作等等 }catch(Exception e){ e.printStackTrace(); }finally{ exec.shutdown(); } } }}
Submit方法會產生Future物件,他用Callable返回結果的特定型別
進行了引數化。你可以用isDemo()方法來查詢Future()是夠已經完
成。當任務完成的時候,他具有一個結果,你可以呼叫get()方法
獲得這個結果。
Java 6/7最佳的休眠方法為TimeUnit.MILLISECONDS.sleep(100);
最好不要用 Thread.sleep(100);