Skip to content

softwaremill/jox

Repository files navigation

Jox

Ideas, suggestions, problems, questions CI Maven Central javadoc

Virtual-thread based safe concurrency & streaming for Java.

Includes:

  • Fast & scalable, completable channels, with Go-like selects (Java 21+)
  • Programmer-friendly structured concurrency (Java 25 only)
  • Finite & infinite streaming using flows, with reactive streams compatibility, (blocking) I/O integration and a high-level, “functional” API (Java 25 only)

Find out more in the documentation available at jox.softwaremill.com.

A tour of Jox

Selectable channels:

var ch1 = Channel.<Integer>newBufferedDefaultChannel();
var ch2 = Channel.<Integer>newBufferedDefaultChannel();
var ch3 = Channel.<Integer>newBufferedDefaultChannel();

// send a value to two channels
ch2.send(29);
ch3.send(32);

var received = select(ch1.receiveClause(), ch2.receiveClause(), ch3.receiveClause());

A push-based, backpressured flow with time-based & parallel processing:

var nats =
  Flows.unfold(0, i -> Optional.of(Map.entry(i+1, i+1)));
 
Flows.range(1, 100, 1)
  .throttle(1, Duration.ofSeconds(1))
  .mapPar(4, i -> {
    Thread.sleep(5000);
    var j = i*3;
    return j+1;
  })
  .filter(i -> i % 2 == 0)
  .zip(nats)
  .runForeach(IO::println);

Structured concurrency scope:

var result = supervised(scope -> {
    var f1 = scope.fork(() -> {
        Thread.sleep(500);
        return 5;
    });
    var f2 = scope.fork(() -> {
        Thread.sleep(1000);
        return 6;
    });
    return f1.join() + f2.join();
});
IO.println("result = " + result);

Feedback

Is what we are looking for!

Let us know in the issues, or our community forum.

Project sponsor

We offer commercial development services. Contact us to learn more!

Building & working on Jox

Jox uses the spotless maven plugin to format code. The formatting is automatically applied during compilation. Formatting can be checked using mvn spotless:check and applied with mvn spotless:apply.

When using VS Code, format-on-save should be disabled (see the pom.xml). For IntelliJ, it might be necessary to install the spotless plugin to properly reformat the sources.

Channel concurrency tests using Fray

Apart from unit & stress tests, which live in the channels/src/test/java directory, Jox includes additional concurrency tests using the Fray library. The library runs a number of randomized, but deterministic tests using orchestrated code & JVM. That way, even though the tests are not exhaustive, so we are not able to prove that the code is 100% race & deadlock-free, we gain a new approach to verifying thread interleavings which would otherwise be hard to obtain.

The concurrency tests are only run when the integration-tests profile is enabled. That is, when in the channels-fray-tests module:

  • mvn test - Tests are skipped
  • mvn verify - Tests are skipped
  • mvn integration-test -Pintegration-tests - Tests run during the integration-test phase
  • mvn verify -Pintegration-tests - Tests run during the integration-test phase

The test runs can be parametrized using the CHANNEL_SIZE and JOX_SEGMENT_SIZE environment variables. By default, these have the values 16 and 32. Note that the segment size affects not only the tests, but all channels, so be careful to change it only for scoped test runs.

Copyright

Copyright (C) 2023-2025 SoftwareMill https://softwaremill.com.

About

Virtual-thread based safe concurrency & streaming

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 8