- Accepting negative task submit delay, convert to zero.
- Logging timer task errors instead of propagating and killing timer.
- Clearing thread interrupted state before returning to timer.
- Set a distinct timer thread name.
- Executors implements a toString with a unique ID (with possible 64-bit overflow duplication) to help debugging.
- Executors close thread is named to help debugging.
- Fixed bug where all futures from all executors were canceled when any executor was closed.
- Improved Java Applet / Web Start compatibility:
- Reduced expected
SecurityExceptionlogging from WARNING to FINE.
- Reduced expected
Fixed race condition in
KeyedConcurrencyReducerwhere a new thread coming in when a result is already finished is never notified and deadlocks the reducer. This is done by returning early when the result is finished, instead of entering the wait/notify code path.
- Now properly restoring Thread interrupted state on
notifyAll()since more than one thread can be waiting on
- Now supports Java 9+ modules with included
- Maven artifact relocated from
- Package renamed from
ConcurrencyLimiterdivided into two implementations:
KeyedConcurrencyReducer(when limiting by key) and
ConcurrencyReducerwhen is a single reduction.
ThreadDeaththe first thread still gets the actual
ThreadDeath, while all waiting threads now get
ExecutionException. Previously, on thread death waiting threads were never notified.
AutoCloseable, which supports try-with-resources in Java 1.7+.
The sequential executor is no longer substituted in place of the per-processor
executor on single-CPU systems. This is because the sequential executor and
per-processor executor have different behavior when
Future.get(…)is never called. When
Future.get(…)is never called, the sequential executor does not execute the task while the per-processor will still execute it in the background.
- Minimum Java version changed from 1.7 to 1.8.
Reduced use of property substitutions in
pom.xml. This is to help 3rd-party parsers that fail to perform full Maven-compatible substitutions.
Renamed package from
com.aoindustries.concurrent. Resolves split-package with AO Lang.
- Using managed dependencies:
- This project uses managed dependencies.
- This project's managed dependencies may also be imported by other projects.
- Minimum Java version changed from 1.6 to 1.7.
- Updated dependencies.
- Accepting less specific generic bounds.
- Improved Javadoc formatting.
- Improved README formatting.
- Project moved to GitHub and Maven.
- Added multiple per-processor thread pools to avoid possible deadlock while also avoiding blowing-out to unbounded concurrency.
- Now automatically maintains some ThreadLocal values between caller and executor during concurrent processing, and provides wrapper hook for subclasses to extend.
- Cleaned-up executors API.
- Providing access to preferred concurrency.
- Added a sequential executor for when non-threaded execution is desired.
- Each lock object now a small empty class to help identify lock contention.
The lock contention profiler in NetBeans is just showing "java.lang.Object" all over, and can't seem to get from the lock object id to the actual object in the heap dump using OQL (id not found).
- Reduced lock contention significantly through atomic operations and fine-grained locking.