1. 程式人生 > 其它 >Java建立執行緒的方法和區別

Java建立執行緒的方法和區別

技術標籤:Java併發程式設計java多執行緒thread

文章目錄

建立執行緒的四種方式

  • 1:繼承Thread類建立執行緒

  • 2:實現Runnable介面建立執行緒

  • 3:使用Callable和FutureTask建立執行緒

  • 4:使用執行緒池,例如用Executor框架建立執行緒

區別

1、使用繼承Thread類的方式建立多執行緒

  • 因為java單繼承的機制無法再繼承其他的類

  • 直接使用this即可獲得當前執行緒

2、實現Callable和Runnable建立多執行緒

  • 執行緒類只是實現了Runnable介面或Callable介面,還可以繼承其他類。

  • 在這種方式下,多個執行緒可以共享同一個target物件,所以非常適合多個相同執行緒來處理同一份資源的情況,從而可以將CPU、程式碼和資料分開,形成清晰的模型,較好地體現了面向物件的思想。

3、Callable和Runnable的區別

相同點:

  1. 兩者都是介面

  2. 兩者都需要呼叫Thread.start啟動執行緒

不同點:

  1. callable的核心是call方法,允許返回值,runnable的核心是run方法,沒有返回值

  2. call方法可以丟擲異常,但是run方法不行

  3. 因為runnable是java1.1就有了,所以他不存在返回值,後期在java1.5進行了優化,就出現了callable,就有了返回值和拋異常

  4. callable和runnable都可以應用於executors。而thread類只支援runnable

示例

/**
 * CreateThreadTest
 *
 * @author xgSama
 * @date 2021/1/19 11:46
 */
public class CreateThreadTest {

    public static void main(String[] args) throws Exception {
        // 方式一:繼承Thread
        MyThread thread1 = new MyThread();
        thread1.
start(); // 方式二:實現Runable Thread thread2 = new Thread(new MyRunnable()); thread2.start(); // 方式三:實現Callable Callable<Integer> callable = new MyCallable(); FutureTask<Integer> futureTask = new FutureTask<>(callable); Thread thread3 = new Thread(futureTask); thread3.start(); Integer integer = futureTask.get(); System.out.println(integer); // 方式四:執行緒池 ExecutorService es = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) { es.execute(() -> System.out.println(Thread.currentThread() + "created by Executors")); } es.shutdown(); } } // 方式一、繼承Thread類,重寫run方法 class MyThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread() + "created by Thread"); } } // 方二、實現Runnable介面,重寫run方法,將實現類的例項物件作為Thread建構函式的target建立並啟動執行緒 class MyRunnable implements Runnable { @Override public void run() { System.out.println(Thread.currentThread() + "created by Runnable"); } } // 方式三、實現Callable介面,使用FutureTask類包裝Callable物件,使用FutureTask物件作為Thread物件的target建立並啟動執行緒 class MyCallable implements Callable<Integer> { @Override public Integer call() { System.out.println(Thread.currentThread() + "created by Callable "); return 666; } }