From 5440722e06d1ef2d37363e8cde0a13d7ef42a970 Mon Sep 17 00:00:00 2001 From: Donald Date: Wed, 15 Sep 2021 15:30:46 +0800 Subject: [PATCH] AspectJ doesn't support multi thread when using Main.run() in AJXTask. The reason is that in aspectjtools class Dump will set MessageHandler in a static field. And in latest version aspectjtools1.9.7 there is one more case, ClasspathJar also keeps openArchives in a static field and has concurrent issue. Most of the issues about "zip is empty" is related to this bug. --- .../plugin/android/aspectjx/internal/AJXTaskManager.groovy | 2 +- .../aspectjx/internal/concurrent/BatchTaskScheduler.groovy | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/AJXTaskManager.groovy b/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/AJXTaskManager.groovy index 8a45495..4044720 100644 --- a/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/AJXTaskManager.groovy +++ b/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/AJXTaskManager.groovy @@ -32,7 +32,7 @@ class AJXTaskManager { String sourceCompatibility String targetCompatibility - BatchTaskScheduler batchTaskScheduler = new BatchTaskScheduler() + BatchTaskScheduler batchTaskScheduler = new BatchTaskScheduler(1) AJXTaskManager() { } diff --git a/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/concurrent/BatchTaskScheduler.groovy b/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/concurrent/BatchTaskScheduler.groovy index a6cd616..6c12476 100644 --- a/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/concurrent/BatchTaskScheduler.groovy +++ b/aspectjx/src/main/groovy/com/hujiang/gradle/plugin/android/aspectjx/internal/concurrent/BatchTaskScheduler.groovy @@ -32,6 +32,10 @@ class BatchTaskScheduler { executorService = Executors.newScheduledThreadPool(Runtime.runtime.availableProcessors() + 1) } + BatchTaskScheduler(int count) { + executorService = Executors.newScheduledThreadPool(count) + } + public void addTask(T task) { tasks << task }