I used to use transactions myself (dosync) but I noticed improvement when changing to core.async and use poll and offer for state management, also dereferencing System/currentTimeMillis is maybe bit heavy, just thinking out loud, if the idea of control signal would loosen up the cpu. The control signal could be written in c or java.