The following blocking operations are fiber virtual thread friendly in the current prototype; these methods do not pin the carrier thread when the operation blocks.
API | Methods | Notes |
---|---|---|
java.net.Socket | connect, read, write | |
java.net.ServerSocket | accept | |
java.nio.channels.SocketChannel | connect, read, write | socket adaptor connect, read, and write also okay |
java.nio.channels.ServerSocketChannel | accept | socket adaptor accept also okay |
java.nio.channels.DatagramChannel | read, receive | socket adaptor receive also okay write and send do not block |
java.nio.channels.Pipe.SourceChannel | read | |
java.nio.channels.Pipe.SinkChannel | write | |
java.net.InetAddress | getByName, getAllByName, .. | These methods currently off load name/address resolution to background thread pool where threads block in the underlying NSS/equivalent. An alternative name service implementation for InetAddress is being developed in the sandbox (aefimov-dns-client-branch) that will be virtual thread friendly. |
The following blocking operations are not currently fiber virtual thread friendly; these methods pin the carrier thread when the operation blocks.
API | Methods | Notes | |||
---|---|---|---|---|---|
java.net.DatagramSocket/MulticastSocket | receive | This will be resolved when DatagramSocket's implementation is replaced | java.net.InetAddress | getByName, getAllByName, .. | These methods block in NSS/equivalent and are invoked using a ManagedBlocker to allow the number of carrier threads to increase when fibers are blocked in these lookup mechanism. Alternative options being explored are using a separate thread pool for lookups or dusting off the JNDI DNS provider. The foundation work for this replacement has done in the main line for JDK 14. |
java.nio.channels.Selector | select | Selection operations are specified to synchronize on the selector and the selected-key set. May not be a concern as code using fibers should not need to use non-blocking I/O and Selectors. |