You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/main/asciidoc/index.adoc
+41-44Lines changed: 41 additions & 44 deletions
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,18 @@ Use virtual threads to write Vert.x code that looks like it is synchronous.
4
4
5
5
You still write the traditional Vert.x code processing events, but you have the opportunity to write synchronous code for complex workflows and use thread locals in such workflows.
6
6
7
+
== Introduction
8
+
9
+
One of the key advantages of Vert.x over many legacy application platforms is that it is almost entirely non-blocking (of kernel threads) - this allows it to handle a lot of concurrency (e.g. handle many connections, or messages) using a very small number of kernel threads, which allows it to scale very well.
10
+
11
+
The non-blocking nature of Vert.x leads to asynchronous APIs. Asynchronous APIs can take various forms including callback style, promises or Rx-style. Vert.x uses futurese in most places (although, it also supports Rx).
12
+
13
+
In some cases, programming using asynchronous APIs can be more challenging than using a direct synchronous style, in particular if you have several operations that you want to do in sequence. Also, error propagation is often more complex when using asynchronous APIs.
14
+
15
+
Vertx virtual threads allows you to work with asynchronous APIs, but using a direct synchronous style that you're already familiar with.
16
+
17
+
It does this by using Java 21 virtual threads. Virtual threads are very lightweight threads that do not correspond to underlying kernel threads. When they are blocked they do not block a kernel thread.
18
+
7
19
== Usage
8
20
9
21
To use the virtual threads with Vert.x add the following dependency to the _dependencies_ section of your build descriptor:
@@ -27,92 +39,77 @@ dependencies {
27
39
}
28
40
----
29
41
30
-
== Getting started
42
+
== Using virtual threads
43
+
44
+
You can deploy virtual thread verticles.
45
+
46
+
A virtual thread verticle is a worker verticle that requires only a *single* instance of the verticle to run the application.
47
+
48
+
When the verticle *awaits* a result, the verticle can still process events like an event-loop verticle.
This project implements virtual threads with Vert.x with a race free model. Events are dispatched to a virtual thread, when this virtual thread awaits an asynchronous result, the pending events are not dispatched until the virtual thread is resumed.
When a virtual thread awaits a future, a new virtual thread can be started to handle new events and avoid blocking the appliction or potential self deadlocks, e.g. in the following example, awaiting the response does not prevent the timer to fire
81
+
You can acquire the ownership of a `java.util.concurrent.locks`
If you block a virtual thread without `{@link io.vertx.virtualthreads.await.Async`, your application then will behave like a regular worker and events will not be processed until the current task ends.
88
+
=== Field visibility
78
89
79
-
== Verticles
80
-
81
-
Virtual thread verticles are actually worker verticles, however a single worker instance is enough to execute it.
90
+
A virtual thread verticle can interact safely with fields before an `await` call. However, if you are reading a field before an `await` call and reusing the value after the call, you should keep in mind that this value might have changed.
When your application blocks without using `await`, e.g. using `ReentrantLock#lock`, the Vert.x scheduler is not aware of it and cannot schedule events on the verticle: it behaves like a regular worker verticle, yet using virtual threads.
This use case is not encouraged but it is not forbidden, however the verticle should be deployed with several instances to deliver the aimed concurrency, like a regular worker verticle.
114
111
115
-
== Thread local support
112
+
=== Thread local support
116
113
117
114
Thread locals are only reliable within the execution of a context task.
0 commit comments