java如何實現非同步(通過子執行緒)
阿新 • • 發佈:2021-11-24
1. jdk1.8之前的Future
jdk併發包裡的Future代表了未來的某個結果,當我們向執行緒池中提交任務的時候會返回該物件,可以通過future獲得執行的結果,但是jdk1.8之前的Future有點雞肋,並不能實現真正的非同步,需要阻塞的獲取結果,或者不斷的輪詢。
通常我們希望當執行緒執行完一些耗時的任務後,能夠自動的通知我們結果,很遺憾這在原生jdk1.8之前是不支援的,但是我們可以通過第三方的庫實現真正的非同步回撥。
/**
* jdk1.8之前的Future
* @author Administrator
*/
public class JavaFuture {
public static void main(String[] args) throws Throwable, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<String> f = executor.submit(new Callable<String>() {
如果想獲得耗時操作的結果,可以通過get()
方法獲取,但是該方法會阻塞當前執行緒,我們可以在做完剩下的某些工作的時候呼叫get()
方法試圖去獲取結果。
也可以呼叫非阻塞的方法isDone
來確定操作是否完成,isDone
這種方式有點兒類似下面的過程:(同步非阻塞)
2. jdk1.8開始的Future
直到jdk1.8才算真正支援了非同步操作,jdk1.8中提供了lambda
表示式,使得java向函式式語言又靠近了一步。藉助jdk原生的CompletableFuture
可以實現非同步的操作,同時結合lambada
表示式大大簡化了程式碼量。程式碼例子如下:
簡單非同步實現
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Supplier;
public class JavaPromise {
public static void main(String[] args) throws Throwable, ExecutionException {
// 兩個執行緒的執行緒池
ExecutorService executor = Executors.newFixedThreadPool(2);
//jdk1.8之前的實現方式
CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() {
換句話說,就是需要在非同步呼叫過程中,持續阻塞至獲得呼叫結果。
-
使用wait和notify方法
-
使用條件鎖
-
Future
-
使用CountDownLatch
-
使用CyclicBarrier