在java中,Runnable 接口僅提供多線程編程的基本功能。它有很多限制。Callable 和 Future 接口解決了許多限制。對java感興趣的同學可以參加java培訓,可以獲得快速有效的學習。
Runnable接口
Runnable 接口用于指定一個打算由線程執行的類。它有一個單獨的無參數方法,稱為 run(),它必須被實現的類覆蓋。這個接口的核心思想是為那些想要在代碼仍在執行中執行的對象提供一個通用協議——換句話說,一個正在運行的代碼段調用另一段代碼而不被停止或終止(同時執行)。有一個名為 Thread 的類,它提供相同的功能,但不同之處在于它必須是子類(繼承)才能使用。存在接口和類的原因是為了達到相同的目標,這是面向對象設計所遵循的建議:除非我們打算通過操作一個或多個類來改變它的含義,否則不應繼承類。它的方法和增強它的屬性。通過實現 Thread 類的對應接口,稱為 Runnable,我們幾乎可以擺脫擴展類(子類化)的重任,同時在我們的程序中獲得線程實現的全部好處。Java API 文檔也符合相同的想法:在大多數情況下,如果你打算覆蓋 run() 方法而不是其他 Thread 方法,則應該使用 Runnable 接口。
請注意,多線程編程是一個龐大而復雜的領域。Runnable 接口僅提供基本功能。當執行長操作并且應用程序希望在執行之間進行通信時,這會造成嚴重的限制。因為 run 方法不返回值,所以跨執行線程進行通信的唯一方法是使用共享的可變數據。現在,共享數據的問題是它們必須同步才能在調用線程之間進行讀寫。Callable 接口試圖解決這個限制。在java培訓中,有很多關于Runnable接口的知識課程,在專業老師的教學指導下,可以很全面地掌握網絡安全的相關知識和技能。
Callable接口
Callable接口旨在定義一個返回結果并可能引發異常的任務。它在 java.util.concurrent 包中聲明。此接口還包含一個單一的、無參數的方法,稱為 call (),將被此接口的實現者覆蓋。該方法與Runnable接口的run()方法類似,只是它返回一個值,并且可以拋出一個已檢查的異常。事實上,整個想法是 Callable 只不過是 Runnable,因為這兩個接口都指定了一個有可能被另一個線程執行的類,只是它不受 Runnable 的限制。
因此,Callable 和 Runnable 的使用幾乎是可以互換的,除了我們談到的原因。使用 Callable 的應用程序通常與實現 Runnable 或 Callable 接口的其他類同時運行。
Future 接口
Future 接口是一個通用接口,表示從異步計算返回的值。它包含檢查計算是否已完成或等待它,檢索結果的方法。在前面的代碼中,Future 的 get() 方法阻塞了調用線程,等待 Callable 完成計算,然后檢索結果。該接口還包含取消 Callable 執行的方法。但是,一旦計算完成,就不能取消。
在這個接口的眾多實現中,Java 8 引入的 CompletableFuture 類使我們能夠異步執行 Runnable 來執行不返回值的任務,以及返回值的 Supplier 任務。Supplier 是一個函數式接口,它包含一個單一的、無參數的方法,稱為 get(),并返回一個結果,如 Callable。CompletableFuture 類具有各種高級功能,供程序員對 Future 接口進行操作。
結論
Callable 接口是對 Java 并發 API 的一個有趣的補充; 它解決了 Runnable 的問題。通過 Callable 創建的線程可以返回一個值。這是一個強大的功能,可用于創建一個多線程程序,該程序可以返回由多個線程同時完成的各種部分或全部完成的計算結果。此外,線程可以返回它們的狀態碼,指示其計算的成功或不成功的計算。想學習java技術的同學,不妨報個Java培訓班,有明確清晰的學習路線,理論知識+實戰操作,可以獲得快速提升。