java多執行緒程式設計歷史演變【截止到jdk8】
阿新 • • 發佈:2018-12-18
最近看了咕泡學視訊教程,這裡算是做一個記錄。
一、JDK1.5之前時代
建立執行緒的方式
繼承thread
package study.java5; /** * @Auther: zhw * @Date: 2018/10/28 11:16 * @Description: 1.5多執行緒方式1 */ public class ThreadDemo { public static void main(String[] args) { Demo1 demo1 = new Demo1(); demo1.start(); } } class Demo1 extends Thread { @Override public void run() { System.out.println("執行緒開始執行"); } }
實現Runnable介面
package study.java5; /** * @Auther: zhw * @Date: 2018/10/28 12:29 * @Description: //TODO */ public class RunnableDemo { public static void main(String[] args) { Demo2 demo2 =new Demo2(); Thread thread = new Thread(demo2); thread.start(); } } class Demo2 implements Runnable{ @Override public void run() { System.out.println("執行緒開始執行"); } }
1.5總結:
1、缺少執行緒池的管理 2、想獲取執行緒執行的結果非常麻煩
二、JDK1.5時代
2.1、Executors
這個可以算是執行緒的管理,其中包含各種執行緒服務 ExecutorService:最常見的執行者。生命週期 ScheduledExecutorService:帶有任務排程的執行者 ThreadFactory:執行緒工廠,用於建立新執行緒
2.2、ExecutorService執行緒服務
public class ExecutorsExecutorService { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(2); Future<String> future = executorService.submit(new Callable<String>(){ @Override public String call() throws Exception { return "first executorService"; } }); //do other thing String result = ""; try { result = future.get(); }catch (Exception e) { e.printStackTrace(); } System.out.println(result); } }
如上面例子,建立了一個數量為2的執行緒池,返回了ExecutorServie,ExecutorServie呼叫了submit方法產生了一個Future結果. 區分Callable和Future
Callable:是源頭,是任務,是產生結果的。 Future:Future是用於獲取結果的。由於Callable的呼叫是非同步的,也就是說結果不知道什麼時候產生,也就是這個單詞的意思“未來”,這是個未來結果。
詳解Future
- get:這個方法會一直等待結果的完成,然後獲取結果,這個方法還支援等待的最大時間,超過這個時間就不繼續等待。
- isDone:判斷結果是否完成
- cancel:取消任務,未開始或已完成返回false,引數表示是否中斷執行中的執行緒 更詳細的描述
- isCancelled:是否取消了。