OUR
Courses
- Java Programmer & Developer
- Java 25 Basics Training
- Java 25 Advanced
- Java 25 & 21 New Features Training
- Java 21 New Features Training
- Java SE 8 New Features Training
- Java 9-17 New Features Training
- Preparation for Java certification
- GraalVM – Introduction and Use
- Performance tuning of Java applications
- Clean Code Training
- Training in Test-Driven Development with Java
- Java & JUnit training for testers
- Training on developing rich clients with JavaFX
- JavaScript
- AI in Development
- Spring Framework
- Java Enterprise
- Microservices & Cloud
- Java Web
- Web & Application Server
- Android & iOS
- Java Architecture & Design
- Software Test
- DevOps & Build Automation
- Agile software development with Scrum
- NoSQL and Streaming Systems
- Other Topics
- Backend Rest Server Training with Node.js
- Training in the development of machine learning models
- AWS Cloud Functions training with Node.js and TypeScript
- Training in programming with Kotlin
- Python programming training
- Spring AI: Integrating AI into self-developed software
- AI Tools Training for Java Developers
Virtual Threads represent an innovation in Java, introduced with Project Loom. They serve to make the simultaneous processing of multiple tasks more efficient. These threads are designed as a lightweight alternative to traditional operating system threads and aim to optimize the performance of applications that handle a large number of parallel processes, especially during I/O-waiting operations.
The advantages of virtual threads are numerous:
Enhanced scalability: Unlike platform threads, virtual threads allow a single Java instance to manage millions of concurrent threads, breaking the limits of traditional threads.
Increased efficiency: Since virtual threads are under the control of the JVM, they can be scheduled and managed with greater efficiency in terms of CPU utilization, which is particularly noticeable when a thread is waiting for an I/O action.
Simplifying parallelism: Virtual Threads allow developers to use familiar synchronization tools to synchronize access to shared resources, instead of relying on more complex asynchronous structures.
Less unnecessary code: The ability to apply synchronous programming patterns reduces the need for additional code that often accompanies asynchronous programming.
Optimized performance for I/O-intensive applications: Applications that rely heavily on input and output operations benefit particularly from the properties of Virtual Threads, as these minimize blocking times.
Simplified error handling: Handling errors in a synchronous programming style is generally more intuitive and easier to implement than in an asynchronous context.
Structured concurrency is a programming paradigm in Java that aims to simplify and improve the safety of working with concurrent processes—that is, the parallel execution of multiple computations. It's a concept that binds the lifetime of concurrent processes to the program structure in which they are started. This means that if a method or block of code initiates concurrent processes, these processes must not continue running beyond the completion of that method or block's execution.
Structured Concurrency offers several advantages:
Easier error handling: Errors occurring in concurrent processes can be handled at the point where the processes were started, simplifying and centralizing error handling.
Improved readability: Because the concurrent processes have a clearly defined structure, the code containing concurrent operations becomes easier to read and understand.
Lifecycle management: Structured concurrency helps manage the lifecycle of threads by ensuring that all started threads terminate before the parent block completes. This prevents "orphaned" threads that continue running and consuming resources after the main program finishes.
Safe termination: When a block of code that initiates concurrent processes completes, all its processes are properly terminated. This prevents problems that could arise from unexpectedly aborted operations.
Improved resource utilization: By terminating concurrent processes in a structured manner, more efficient resource utilization can be achieved, as resources are not unnecessarily occupied by processes that are no longer needed.
In Java, structured concurrency can be implemented through various mechanisms such as the ExecutorService API or frameworks and libraries that support this paradigm. It is also a key part of the design behind Project Loom, which plans the introduction of lightweight threads—virtual threads—to further simplify the use of structured concurrency in Java.
The Vector API in Java is an experimental API introduced as part of Project Panama to provide a new way to efficiently execute vector-based computations. This API represents a significant advancement in the Java platform, as it allows developers to directly leverage the vector processing capabilities of modern CPUs within Java.
Here are the key points of the Vector API:
Performance improvement: By using SIMD (Single Instruction, Multiple Data) instructions, the Vector API can perform multiple data operations simultaneously, which can lead to a significant acceleration of calculations.
Hardware utilization: The API is designed to effectively utilize the specific vector hardware instruction sets found in modern processors, such as AVX in x86 or NEON in ARM.
Clarity and security: Although it is a low-level operation, the API is designed to fit within the Java language and maintain Java's security and clarity guarantees.
Platform independence: Programs using the Vector API are platform-independent because the API abstracts away the differences in processor instruction sets. The JVM is responsible for executing the most appropriate instruction set for the current platform.
Developer-friendliness: The API is designed to be easy to use and allows seamless integration into existing code, enabling developers to make powerful optimizations without an in-depth understanding of vector hardware.
The Vector API is under incremental development and is part of the JDK Enhancement Proposals (JEPs), which govern the development and integration of new features into the JDK. With each new Java release, improvements and extensions are made to the Vector API to enhance performance and usability.
Final updates for Java 18-21
- Pattern matching for switch
- Record Patterns
- Scoped Values
- Foreign Function & Memory API
- Virtual Threads
- Sequenced Collections
- Internet Address Resolution SPI
Final innovations Java 22-25
- Launch Multi-File Source Code Programs
- Unnamed Variables & Patterns
- Markdown Documentation Comments
- Stream Gatherers
- Key Derivation Function API
- Module Import Declarations
- Flexible Constructor Bodies
- Compact Source Files and Instance Main
- Class-File API
- Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
- Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm
JVM changes
- Ahead-of-Time Class Loading & Linking, Profiling, Command-Line Ergonomics
- JFR Cooperative Sampling
- Compact Object Headers
- JFR Method Timing & Tracing
- Remove the Windows 32-bit x86 Port
- Garbage Collector Changes (Shanandoa, ZGC)
- 32-bit x86 Port for Removal
Previews & Incubators
- Stable Values
- PEM Encodings of Cryptographic Objects
- Structured Concurrency
- Primitive Types in Patterns, instanceof, and switch
- Vector API
- JFR CPU-Time Profiling
- String Templates
Previous knowledge
- Basics in Java Programming
Java Programming Language
Target group
- Java developers who have used Java 8-17
want to upgrade to Java 21 or Java 25