Vertx:executeBlocking()とFuture。違いは何ですか?

エヴァン

Vertxのドキュメントでは、executeBlocking()ブロッキングAPIを呼び出す必要がある場合にメソッドを使用することを提案しています。一方、Vertxは、基本的に同じことを行うFutureの概念も提供します。しかし、executeBlocking()メソッドは静的ではありません。また、Futureの単純なラッパーではなく、その実装を見ると、かなり複雑であることがわかります。これら2つの違いは何ですか?

長時間実行されるタスクを非同期で実行したいとします。これら2つの方法に違いはありますか?

方法1:

doTheJob() {
    Future<Void> future = Future.future();
    executeLongRunningBlockingOperation();
    future.complete();
    return future;
}

doTheJob().setHandler(asyncResult -> {
    // ... handle result
});

方法2:

vertx.executeBlocking(future -> {
    executeLongRunningBlockingOperation();
    future.complete();
}, res -> {
    // ... handle result
});
マックス

最初の例は、の正しい使用法ではありませんFuturetoexecuteLongRunningBlockingOperation()呼び出すと、そのメソッドが完了するまでメインスレッドがブロックされます。つまり、ブロック操作が完了するまで、他に何も起こりません。2番目の例では、ブロッキング呼び出しがバックグラウンドスレッドにスピンオフされ、実行中に他のことが発生し続けます。

より完全な例でこれを説明するために、次のコードを使用します。

public void executeLongRunningBlockingOperation() {
    Thread.sleep(5000);
}

public Future<Void> doTheJob() { 
    System.out.println("Doing the job...");
    Future<Void> future = Future.future();
    executeLongRunningBlockingOperation();
    // this line will not be called until executeLongRunningBlockingOperation returns!
    future.complete();
    // nor will this method! This means that the method won't return until the long operation is done!
    return future;
}

public static void main(String[] args) {
    doTheJob().setHandler(asyncResult -> {
        System.out.println("Finished the job");
    });
    System.out.println("Doing other stuff in the mean time...");
}

次の出力が生成されます。

Doing the job...
Finished the job
Doing other stuff in the mean time...

一方、このコード(executeBlockingを使用):

...
public Future<Void> doTheJob() { 
    System.out.println("Doing the job...");
    Future<Void> future = Future.future();
    Vertx vertx = Vertx.vertx();
    vertx.executeBlocking(call -> {
        executeLongRunningBlockingOperation();
        call.complete;
    }, result -> {
        // this will only be called once the blocking operation is done
        future.complete();
    });
    // this method returns immediately since we are not blocking the main thread
    return future;
}
...

生成されます:

Doing the job...
Doing other stuff in the mean time...
Finished the job

Vert.xの理解を深めたい場合は、次のハンズオンチュートリアルをお勧めします。

https://vertx.io/docs/guide-for-java-devs/

http://escoffier.me/vertx-hol/

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

vertxのfutureとpromiseの違いは何ですか?

分類Dev

Scala FutureとJava Futureの違いは何ですか

分類Dev

Futureとfutureの違いは何ですか?

分類Dev

JavaのFutureとFutureTaskの違いは何ですか?

分類Dev

onCompleteとflatMapof Futureの違いは何ですか?

分類Dev

Future / AwaitとAsync / Awaitの違いは何ですか

分類Dev

tokio :: spawn(my_future).awaitとmy_future.awaitの違いは何ですか?

分類Dev

loop.create_task、asyncio.async / ensure_futureとTaskの違いは何ですか?

分類Dev

フラッターのFuture.delayedとTimerの違いは何ですか

分類Dev

VertxのEventBusのsendメソッドとpublishメソッドの違いは何ですか?

分類Dev

JavaScriptのDeferred、Promise、Futureの違いは何ですか?

分類Dev

voidを返すこととFuture <void>を返すことの違いは何ですか?

分類Dev

MVPとMVCとは何ですか?違いは何ですか?

分類Dev

「+ =」と「= +」の違いは何ですか?

分類Dev

/ * ... * /と/ ** ... * /の違いは何ですか

分類Dev

「.equals」と「==」の違いは何ですか?

分類Dev

$ *と$ @の違いは何ですか

分類Dev

「$(this)」と「this」の違いは何ですか?

分類Dev

list()と[]の違いは何ですか

分類Dev

dict()と{}の違いは何ですか?

分類Dev

+ =と= +の違いは何ですか?

分類Dev

#{} $ {}と%{}の違いは何ですか?

分類Dev

@synthesizeと@dynamic、違いは何ですか?

分類Dev

「&nbsp;」の違いは何ですか と「」?

分類Dev

=と==の違いは何ですか?

分類Dev

=と==の違いは何ですか?

分類Dev

$( "")と$ .find( "")の違いは何ですか?

分類Dev

`&`と `ref`の違いは何ですか?

分類Dev

^ a | A $と^(a | A)$の違いは何ですか?

Related 関連記事

  1. 1

    vertxのfutureとpromiseの違いは何ですか?

  2. 2

    Scala FutureとJava Futureの違いは何ですか

  3. 3

    Futureとfutureの違いは何ですか?

  4. 4

    JavaのFutureとFutureTaskの違いは何ですか?

  5. 5

    onCompleteとflatMapof Futureの違いは何ですか?

  6. 6

    Future / AwaitとAsync / Awaitの違いは何ですか

  7. 7

    tokio :: spawn(my_future).awaitとmy_future.awaitの違いは何ですか?

  8. 8

    loop.create_task、asyncio.async / ensure_futureとTaskの違いは何ですか?

  9. 9

    フラッターのFuture.delayedとTimerの違いは何ですか

  10. 10

    VertxのEventBusのsendメソッドとpublishメソッドの違いは何ですか?

  11. 11

    JavaScriptのDeferred、Promise、Futureの違いは何ですか?

  12. 12

    voidを返すこととFuture <void>を返すことの違いは何ですか?

  13. 13

    MVPとMVCとは何ですか?違いは何ですか?

  14. 14

    「+ =」と「= +」の違いは何ですか?

  15. 15

    / * ... * /と/ ** ... * /の違いは何ですか

  16. 16

    「.equals」と「==」の違いは何ですか?

  17. 17

    $ *と$ @の違いは何ですか

  18. 18

    「$(this)」と「this」の違いは何ですか?

  19. 19

    list()と[]の違いは何ですか

  20. 20

    dict()と{}の違いは何ですか?

  21. 21

    + =と= +の違いは何ですか?

  22. 22

    #{} $ {}と%{}の違いは何ですか?

  23. 23

    @synthesizeと@dynamic、違いは何ですか?

  24. 24

    「&nbsp;」の違いは何ですか と「」?

  25. 25

    =と==の違いは何ですか?

  26. 26

    =と==の違いは何ですか?

  27. 27

    $( "")と$ .find( "")の違いは何ですか?

  28. 28

    `&`と `ref`の違いは何ですか?

  29. 29

    ^ a | A $と^(a | A)$の違いは何ですか?

ホットタグ

アーカイブ