Build a small JDK-only test runner from an annotation and reflection, test package-private code with –patch-module, then ship a Java service as a modular JAR, a jlink runtime image and a jpackage installer.
Java’s JDK can both call and serve HTTP with no libraries. Learn HttpClient, sync and async, then build a small JSON tasks service on the built-in HttpServer with virtual threads, correct status codes and a clean shutdown.
Java can run a hundred thousand blocking tasks on a handful of OS threads. Learn how virtual threads mount and unmount, what still pins them, why ScopedValue replaces ThreadLocal, and how StructuredTaskScope cancels work that fails.
Java’s executors run your tasks on a fixed pool of threads and hand back a Future. Learn submit, invokeAll, cancellation, CompletableFuture chains, timeouts, semaphores and blocking queues, with output that never flakes.
Two Java threads that update the same variable can silently lose writes. See why count++ is a race, how synchronized, volatile, atomics and locks fix it, and how to force and detect a deadlock.
Where Java keeps your variables and objects, how the garbage collector decides what to free, why a garbage-collected program can still leak or run out of memory, and how the JIT makes code faster the longer it runs.
Build a two-module Java project with nothing but javac, jar and java. See how packages, imports, the classpath, JAR files and module-info.java fit together, and what Maven and Gradle add on top.
Java lets any reference be null, so a missing value can crash code far from where it went missing. Objects and Optional make a missing value visible, and java.time makes you say which moment, in which city, you mean.
Java lambdas turn a small piece of behaviour into a value, and streams chain those values into lazy pipelines. See how a pipeline really runs, which collectors to reach for, and when a plain loop reads better.
Generics let the compiler check what goes into a list, a box or a method, and then erase that information before the program runs. Learn bounds, wildcards, PECS and how to read a JDK signature by running small programs.