diff --git a/src/main/java/org/syndicate_lang/actors/Actor.java b/src/main/java/org/syndicate_lang/actors/Actor.java index 9a90412..6fd7dbd 100644 --- a/src/main/java/org/syndicate_lang/actors/Actor.java +++ b/src/main/java/org/syndicate_lang/actors/Actor.java @@ -198,24 +198,24 @@ public class Actor { } } + synchronized void _runWorkItems() { + long batch = workItemCount.get(); + while (batch > 0) { + for (int count = 0; count < batch; count++) { + WorkItem i = null; + while (i == null) i = head.get(); + head = i; + this._perform(i); + i.clear(); + } + batch = workItemCount.addAndGet(-batch); + } + } + public void execute(WorkItem item) { tail.getAndSet(item).set(item); if (workItemCount.getAndIncrement() == 0) { - _executor.execute(() -> { - synchronized (this) { - long batch = workItemCount.get(); - while (batch > 0) { - for (int count = 0; count < batch; count++) { - WorkItem i = null; - while (i == null) i = head.get(); - head = i; - this._perform(i); - i.clear(); - } - batch = workItemCount.addAndGet(-batch); - } - } - }); + _executor.execute(this::_runWorkItems); } }