在 Java 中,有多種方式來實現多線程。繼承 Thread 類、實現 Runnable 接java
口、使用 ExecutorService、Callable、Future 實現帶返回結果的多線程。多線程
繼承Thread ide
Thread 類本質上是實現了 Runnable 接口的一個實例,表明一個線程的實例。spa
啓動線程的惟一方法就是經過 Thread 類的 start()實例方法。start()方法是一個線程
native 方法,它會啓動一個新線程,並執行 run()方法。這種方式實現多線程很orm
簡單,經過本身的類直接 extend Thread,並複寫 run()方法,就能夠啓動新線繼承
程並執行本身定義的 run()方法。接口
/** * @auther: tianweichang * @date: 2018/8/28 20 * @Description: 繼承Thread */ public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } public static void main(String[] args) { MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start(); } }
實現Runnable ip
java單線程的問題,若是本身的類已經 extends 另外一個類,就沒法直接 extends Thread,此時,能夠實現一個 Runnable 接口ci
實現Callable接口經過FutureTask包裝器來建立
Thread 線程
有的時候,咱們可能須要讓一步執行的線程在執行完成之後,提供一個返回值
給到當前的主線程,主線程須要依賴這個值進行後續的邏輯處理,那麼這個時
候,就須要用到帶返回值的線程了。Java 中提供了這樣的實現方式
/** * @auther: tianweichang * @date: 2018/8/28 20 * @Description: 實現Callable建立線程 */ public class MyCallable implements Callable<String> { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadExecutor(); MyCallable callableDemo = new MyCallable(); Future<String> future = executorService.submit(callableDemo); System.out.println("返回值:" + future.get());//get是阻塞的 executorService.shutdown(); } @Override public String call() throws Exception { //do your business int a = 1; int b = 2; System.out.println(a + b); return "執行結果:" + (a + b); } }