1.繼承Thread,重寫run()方法,而後用thread.start()啓動線程。 2.實現Runnable接口,重寫Run方法。而後用thread.start()方法啓動線程。 注意:Thread類的底層實現也是實現的Runnable接口。因此這二者建立線程的方法,通常選擇Runnable. 3.實現Callable接口。重寫call方法。有關線程的建立。緩存
@Test public void test03(){ //建立一個Callable的實現類 Callable<Integer> oneCallable = new MyCallableThread<Integer>(); ///註釋:FutureTask<Integer>是一個包裝器,它經過接受Callable<Integer>來建立,它同時實現了Future和Runnable接口 //由Callable的實現類建立一個FutureTask對象 FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable); //由FutureTask建立一個threa對象 Thread oneThread = new Thread(oneTask); oneThread.start(); }
4.是有返回值的線程如何就行操做。 實體類併發
public class MyReturnCallableThread implements Callable<Object>{ private String taskNum; MyReturnCallableThread(String taskNum){ this.taskNum = taskNum; } @Override public Object call() throws Exception { System.out.println(">>>" + taskNum + "任務啓動"); Date dateTmp1 = new Date(); Thread.sleep(1000); Date dateTmp2 = new Date(); long time = dateTmp2.getTime() - dateTmp1.getTime(); System.out.println(">>>" + taskNum + "任務終止"); return taskNum + "任務返回運行結果,當前任務時間【" + time + "毫秒】"; } }
調用方法ide
@Test @SuppressWarnings("unchecked") public void test04() throws InterruptedException, ExecutionException{ System.out.println("----程序開始運行----"); Date date1 = new Date(); int taskSize = 5; // 建立一個線程池 ,數量爲5 ExecutorService pool = Executors.newFixedThreadPool(taskSize); // 建立多個有返回值的任務 List<Future> list = new ArrayList<Future>(); for (int i = 0; i < taskSize; i++) { Callable c = new MyReturnCallableThread(i + " "); // 執行任務並獲取Future對象 Future f = pool.submit(c); System.out.println(">>>" + f.get().toString()); // System.out.println(">>>" + f.get().toString()); list.add(f); } // 關閉線程池 pool.shutdown(); // 獲取全部併發任務的運行結果 for (Future f : list) { // 從Future對象上獲取任務的返回值,並輸出到控制檯 System.out.println(">>>" + f.get().toString()); } Date date2 = new Date(); System.out.println("----程序結束運行----,程序運行時間【" + (date2.getTime() - date1.getTime()) + "毫秒】"); }
上述代碼中Executors類,提供了一系列工廠方法用於建立線程池,返回的線程池都實現了ExecutorService接口。 public static ExecutorService newFixedThreadPool(int nThreads) 建立固定數目線程的線程池。 public static ExecutorService newCachedThreadPool() 建立一個可緩存的線程池,調用execute 將重用之前構造的線程(若是線程可用)。若是現有線程沒有可用的,則建立一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。 public static ExecutorService newSingleThreadExecutor() 建立一個單線程化的Executor。 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 建立一個支持定時及週期性的任務執行的線程池,多數狀況下可用來替代Timer類。this
ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。若是Executor後臺線程池尚未完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成線程