回覆列表
  • 1 # 架構師成長錄

    java裡面建立執行緒有四種方式,這四種方式可以透過是否有返回值進行區分:

    無返回

    1. 建立任務,實現Runnable介面,重寫run();

    2. 繼承Thread類,重寫run();

    有返回

    1. 實現Callable介面,重寫call(),利用FutureTask包裝Callable,並作為task傳入Thread建構函式;

    2. 使用執行緒池。

    首先我們來看下執行緒之間的狀態,及他們之間的相互轉換:

    實現Runnable介面

    因為Java只支援單繼承,繼承了Thread類就不能再繼承別的類了,所以實現繼承更推薦讓執行緒類實現Runnable介面。將Runnbale作為引數傳入Thread的建構函式,建立Thread。

    繼承Thread類,重寫run()

    建立執行緒只需要繼承Thread類,然後在run()方法裡寫下執行緒要實現的任務即可;透過呼叫start方法來啟動執行緒,但不能直接呼叫run()方法。

    ① Thread類本質上是實現了Runnable介面,代表一個執行緒的例項。

    ② Runnable介面只有一個抽象的run()方法。

    ④ start()方法是一個native方法,它將啟動一個新的執行緒,並執行run()方法。

    ⑤ 自定義類直接繼承Thread,並重寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。

    利用Callable介面建立並啟動

    ① 定義MyClass實現Callable介面;

    ② 重寫call(),將執行的程式碼邏輯植入;

    FutureTask futuretask = new FutureTask(newMyClass());

    ④ 建立Thread的物件;

    Thread thread = new Thread(futuretask);//傳入引數Runnable介面

    ⑤ 啟動執行緒;thread.start();

    ⑥ 可透過FutureTask類的get()方法獲得執行緒執行結束後的返回值,即call的返回值。futuretask.get();

    透過執行緒池來建立執行緒

    ① new ThreadPoolExecutor(…);

    ② 建立任務Task implements Callable,重寫run()方法;

    ④ 獲取返回值。

    示例程式碼如下:

    總結

    執行緒的建立有四種方式:主要分為有返回和無返回,具體根據使用場景來選擇。

    ① 如果不需要返回且執行緒數量小,則建議採用實現Runnable介面,重寫run()的方式;

    ② 如果需要返回且執行緒數量小,則建議採用實現Callable介面,重寫call(),利用FutureTask包裝成一個Runnable,再作為引數傳入Thread的構造方法的方式建立執行緒;

  • 2 # 星辰大洋

    在java語言中,執行緒的類名是Thread,有兩種方式建立執行緒:直接建立Thread物件或者建立執行緒池,由執行緒池來管理執行緒。

    直接建立Thread物件

    我們可以直接用預設建構函式建立一個執行緒

    Thread thread = new Thread();

    然後呼叫它的start方法來啟動執行緒:

    thread.start();

    此時執行緒並不會執行業務程式碼,很快就會執行完畢。

    要想讓執行緒執行目的碼,有多種方式:

    1、將目的碼編寫在一個實現了Runnable介面的類的run方法中,建立執行緒時,用這個類的例項作為建構函式引數;

    或者直接建立一個Runnable介面的匿名子類,用這個

    2、建立一個Thread類的子類,在子類重寫run方法,在run方法中實現業務:

    然後再建立一個Thread子類例項,並呼叫start方法執行業務程式碼

    或者建立一個Thread的匿名子類:

    使用執行緒池

    Executors類提供了四類建立執行緒池的靜態方法,它們都會返回ExecutorService介面的例項,這些例項就是執行緒池,只需要呼叫它的submit方法,將要執行的任務提交給執行緒池,執行緒池就會按照自己的策略來執行任務。而這個任務,就是實現了Runnable介面的物件。

  • 中秋節和大豐收的關聯?
  • 有關工會經費的計提會計分錄?