//匿名 Thread 類 new Thread(){ //重寫 run 方法 @Override public void run() { super.run(); } }.start();
class MyThread extends Thread { @Override public void run() { super.run(); } } //假設把 run 方法當作一個任務,那麼每建立一個線程,就有一個新的任務 MyThread myThread = new MyThread(); myThread.start();
Thread 也實現了 Runnable 接口java
多個線程相互獨立,由於建立了多個任務,沒法實現資源共享(資源寫在 MyThread 類裏)ide
Java 單繼承的特性致使不夠靈活線程
//須要藉助 Thread 類 new Thread(new Runnable() { //重寫 run 方法 @Override public void run() { } }).start();
class MyRunnable implements Runnable { @Override public void run() { } } //其實仍是經過 Thread 類對象來建立線程的,每建立一個線程,傳入的是同一個任務 new Thread(new MyRunnable()).start();
多個線程協調做業,完成同一個任務,實現了資源共享(資源寫在 MyRunnable 類裏)code
能夠避免因爲 java 單繼承特徵帶來的侷限性對象
//一樣須要藉助 Thread 類 new Thread(new FutureTask<String>(new Callable<String>() { @Override public String call() throws Exception { return null; } })).start();
class MyCallable implements Callable<String>{ @Override public String call() throws Exception { return null; } } MyCallable myCallable = new MyCallable(); //FutureTask 實現了 RunnableFuture<V> 接口,而 RunnableFuture 繼承了 Runnable 和 Future<V> FutureTask<String> futureTask = new FutureTask<>(myCallable); //Runnable 的特性 new Thread(futureTask).start(); //獲取返回值, Future<V> 的特性 String result=futureTask.get();
相似於 Runnable 接口繼承
有返回值接口
能夠拋出異常資源
總結:三種方式最終仍是經過 Thread 類對象來真正建立線程的get