Skip to content

Replace platform threads with virtual threads to fix busy-waiting#3446

Open
Kaaldut8 wants to merge 4 commits intoiluwatar:masterfrom
Kaaldut8:master
Open

Replace platform threads with virtual threads to fix busy-waiting#3446
Kaaldut8 wants to merge 4 commits intoiluwatar:masterfrom
Kaaldut8:master

Conversation

@Kaaldut8
Copy link

@Kaaldut8 Kaaldut8 commented Mar 7, 2026

Refactors busy-waiting loops by replacing platform threads with virtual threads and improving concurrency handling across affected components.

Fixes #2977

@github-actions
Copy link

github-actions bot commented Mar 7, 2026

PR Summary

Refactors busy-wait loops by replacing platform threads with virtual threads to improve concurrency handling and avoid busy-wait scenarios. Includes formatting enforcement via Spotless across modules, minor formatting tweaks in several modules, and updates to the session-server to use a virtual-thread-based scheduler for session expiration. Also adds license headers to rate-limiting-pattern sources and expands test file formatting for consistency across the project.

Changes

File Summary
combinator/src/test/java/com/iluwatar/combinator/FinderTest.java Adjusted the FinderTest multi-line string literal formatting to improve readability and align with the project’s formatting rules.
microservices-self-registration/contextservice/pom.xml Added Spotless Maven plugin to enforce consistent Java formatting in the contextservice module.
microservices-self-registration/eurekaserver/pom.xml Added Spotless Maven plugin to enforce consistent Java formatting in the Eurekaserver module.
microservices-self-registration/eurekaserver/src/main/java/com/learning/eurekaserver/EurekaserverApplication.java Adjusted indentation and formatting of the EurekaserverApplication main method for consistency.
microservices-self-registration/eurekaserver/src/test/java/com/learning/eurekaserver/EurekaserverApplicationTests.java Improved formatting and comments in the Eurekaserver application tests to match style guidelines.
microservices-self-registration/greetingservice/pom.xml Added Spotless Maven plugin to enforce formatting in the greetingservice module.
microservices-self-registration/pom.xml Enabled Spotless formatting checks at the parent module level to enforce consistency across modules.
pom.xml Simplified Spotless configuration by removing explicit executions and relying on default googleJavaFormat settings.
rate-limiting-pattern/pom.xml Inserted MIT license header into the rate-limiting-pattern module’s POM to clarify licensing.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiter.java Prepended MIT license header to AdaptiveRateLimiter.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java Adjusted App main to correctly instantiate TokenBucketRateLimiter and added license header.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequest.java Prepended MIT license header to FindCustomerRequest.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiter.java Prepended MIT license header to FixedWindowRateLimiter.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitException.java Prepended MIT license header to RateLimitException.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimitOperation.java Prepended MIT license header to RateLimitOperation.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/RateLimiter.java Prepended MIT license header to RateLimiter.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ServiceUnavailableException.java Prepended MIT license header to ServiceUnavailableException.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/ThrottlingException.java Prepended MIT license header to ThrottlingException.java.
rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java Refactored TokenBucketRateLimiter: added shutdown, per-bucket lastRefillTime, synchronized tryConsume, and refillIfNeeded to support safe token replenishment and thread-safe consumption.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AdaptiveRateLimiterTest.java Prepended MIT license header to AdaptiveRateLimiterTest.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTest.java Prepended MIT license header to AppTest.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/AppTestUtils.java Prepended MIT license header to AppTestUtils.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ConcurrencyTests.java Prepended MIT license header to ConcurrencyTests.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/ExceptionTests.java Prepended MIT license header to ExceptionTests.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FindCustomerRequestTest.java Prepended MIT license header to FindCustomerRequestTest.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/FixedWindowRateLimiterTest.java Prepended MIT license header to FixedWindowRateLimiterTest.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimitOperationTest.java Prepended MIT license header to RateLimitOperationTest.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/RateLimiterTest.java Prepended MIT license header to RateLimiterTest.
rate-limiting-pattern/src/test/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiterTest.java Prepended MIT license header to TokenBucketRateLimiterTest.
server-session/src/main/java/com/iluwatar/sessionserver/App.java Replaced thread-based session expiration checker with a virtual-thread-based scheduled task and added a shutdown hook; uses a virtual-thread scheduler.

autogenerated by presubmit.ai

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
  • ea68115: Apply Spotless formatting
Files Processed (2)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (3 hunks)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java (2 hunks)
Actionable Comments (0)
Skipped Comments (8)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java [1-25]

    maintainability: "License header added"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java [89-93]

    maintainability: "Initialize TokenBucketRateLimiter outside try for proper cleanup"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java [107-109]

    maintainability: "Ensure TokenBucketRateLimiter is shutdown to avoid thread leaks"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java [66-68]

    maintainability: "Expose shutdown for the rate limiter's scheduler"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java [74-75]

    design: "Track last refill timestamp for per-second refill policy"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java [79-80]

    maintainability: "Initialize refill timestamp during bucket construction"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java [82-91]

    concurrency: "Make token consumption synchronized and refilling lazy via refillIfNeeded"

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/TokenBucketRateLimiter.java [93-99]

    behavior: "Periodic refill for tokens based on elapsed time"

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 Pull request needs attention.

Review Summary

Commits Considered (1)
  • 90b794b: Removes expression which is always true
Files Processed (1)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java (2 hunks)
Actionable Comments (2)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java [89-89]

    possible bug: "Initialize rate limiter variable outside try."

  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java [91-91]

    possible bug: "Potential risk of null after initialization."

Skipped Comments (1)
  • rate-limiting-pattern/src/main/java/com/iluwatar/rate/limiting/pattern/App.java [1-24]

    maintainability: "Add license header to App.java."

ExecutorService executor = Executors.newFixedThreadPool(3);
ScheduledExecutorService statsPrinter = Executors.newSingleThreadScheduledExecutor();

TokenBucketRateLimiter tb = null;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TokenBucketRateLimiter tb = null;

TokenBucketRateLimiter tb = null;
try {
TokenBucketRateLimiter tb = new TokenBucketRateLimiter(2, 1);
tb = new TokenBucketRateLimiter(2, 1);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tb = new TokenBucketRateLimiter(2, 1);

Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Review Summary

Commits Considered (1)
  • 6d3356e: Add test coverage for sessionserver App
Files Processed (0)
Actionable Comments (0)
Skipped Comments (0)

@sonarqubecloud
Copy link

sonarqubecloud bot commented Mar 7, 2026

Quality Gate Failed Quality Gate failed

Failed conditions
79.4% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix busy-waiting loops

1 participant