66import java .util .concurrent .TimeUnit ;
77
88public class GlobalAffinityThreadPool {
9- private static ThreadPoolExecutor affinityThreadPool ;
9+ private static ThreadPoolExecutor affinityWorldAndRegionPool ;
10+ private static ThreadPoolExecutor affinitySharedPool ;
11+ private static final Object poolSizeLock = new Object ();
1012
11- public static synchronized ExecutorService getAffinityThreadPool () {
12- if (affinityThreadPool == null || affinityThreadPool .isShutdown ()) {
13+
14+ public static synchronized ExecutorService getAffinityWorldAndRegionPool () {
15+ if (affinityWorldAndRegionPool == null || affinityWorldAndRegionPool .isShutdown ()) {
1316 int totalCores = Runtime .getRuntime ().availableProcessors ();
1417
15- AffinityThreadFactory threadFactory = new AffinityThreadFactory ("MCMT-AffinityThread " );
18+ AffinityThreadFactory threadFactory = new AffinityThreadFactory ("MCMT-AffWorldRegionThread " );
1619
17- affinityThreadPool = new ThreadPoolExecutor (
20+ affinityWorldAndRegionPool = new ThreadPoolExecutor (
1821 1 ,
1922 1 ,
2023 0L , TimeUnit .MILLISECONDS ,
@@ -23,36 +26,130 @@ public static synchronized ExecutorService getAffinityThreadPool() {
2326 new ThreadPoolExecutor .AbortPolicy ()
2427 );
2528 }
26- return affinityThreadPool ;
29+ return affinityWorldAndRegionPool ;
30+ }
31+
32+ public static synchronized ExecutorService getAffinitySharedPool () {
33+ if (affinitySharedPool == null || affinitySharedPool .isShutdown ()) {
34+ int totalCores = Runtime .getRuntime ().availableProcessors ();
35+
36+ AffinityThreadFactory threadFactory = new AffinityThreadFactory ("MCMT-AffSharedThread" );
37+
38+ affinitySharedPool = new ThreadPoolExecutor (
39+ totalCores - 2 ,
40+ totalCores - 2 ,
41+ 0L , TimeUnit .MILLISECONDS ,
42+ new LinkedBlockingQueue <>(),
43+ threadFactory ,
44+ new ThreadPoolExecutor .AbortPolicy ()
45+ );
46+ }
47+ return affinitySharedPool ;
48+ }
49+
50+ public static void decreaseWorldAndRegionPoolSize () {
51+ synchronized (poolSizeLock ) {
52+ if (affinityWorldAndRegionPool != null ) {
53+ int targetSize = affinityWorldAndRegionPool .getCorePoolSize () - 1 ;
54+
55+ // First decrease the pool sizes
56+ affinityWorldAndRegionPool .setCorePoolSize (targetSize );
57+ affinityWorldAndRegionPool .setMaximumPoolSize (targetSize );
58+
59+ // Wait for active thread count to reach the new target
60+ while (affinityWorldAndRegionPool .getActiveCount () > targetSize ) {
61+ try {
62+ Thread .sleep (2 ); // Short sleep to prevent busy waiting
63+ } catch (InterruptedException e ) {
64+ Thread .currentThread ().interrupt ();
65+ return ;
66+ }
67+ }
68+
69+ // Now it's safe to increase the shared pool
70+ if (affinitySharedPool != null ) {
71+ increaseSharedPoolSize ();
72+ }
73+ }
74+ }
75+ }
76+
77+ public static void increaseWorldAndRegionPoolSize () {
78+ synchronized (poolSizeLock ) {
79+ if (affinityWorldAndRegionPool != null ) {
80+ if (affinitySharedPool != null ) {
81+ // First decrease shared pool
82+ decreaseSharedPoolSize ();
83+
84+ // Wait for shared pool to properly decrease
85+ int targetSharedSize = affinitySharedPool .getCorePoolSize ();
86+ while (affinitySharedPool .getActiveCount () > targetSharedSize ) {
87+ try {
88+ Thread .sleep (2 );
89+ } catch (InterruptedException e ) {
90+ Thread .currentThread ().interrupt ();
91+ return ;
92+ }
93+ }
94+ }
95+
96+ // Now safely increase WorldAndRegion pool
97+ int newSize = affinityWorldAndRegionPool .getCorePoolSize () + 1 ;
98+ affinityWorldAndRegionPool .setMaximumPoolSize (newSize );
99+ affinityWorldAndRegionPool .setCorePoolSize (newSize );
100+ }
101+ }
27102 }
28103
29- public static void increasePoolSize () {
30- if (affinityThreadPool != null ) {
31- affinityThreadPool .setMaximumPoolSize (affinityThreadPool .getMaximumPoolSize () + 1 );
32- affinityThreadPool .setCorePoolSize (affinityThreadPool .getCorePoolSize () + 1 );
104+ private static void increaseSharedPoolSize () {
105+ synchronized (poolSizeLock ) {
106+ if (affinitySharedPool != null ) {
107+ int newSize = affinitySharedPool .getMaximumPoolSize () + 1 ;
108+ affinitySharedPool .setMaximumPoolSize (newSize );
109+ affinitySharedPool .setCorePoolSize (newSize );
110+ }
33111 }
34112 }
35113
36- public static void decreasePoolSize () {
37- if (affinityThreadPool != null ) {
38- affinityThreadPool .setCorePoolSize (affinityThreadPool .getCorePoolSize () - 1 );
39- affinityThreadPool .setMaximumPoolSize (affinityThreadPool .getMaximumPoolSize () - 1 );
114+ private static void decreaseSharedPoolSize () {
115+ synchronized (poolSizeLock ) {
116+ if (affinitySharedPool != null ) {
117+ int newSize = affinitySharedPool .getCorePoolSize () - 1 ;
118+ affinitySharedPool .setCorePoolSize (newSize );
119+ affinitySharedPool .setMaximumPoolSize (newSize );
120+ }
40121 }
41122 }
42123
124+
43125 public static void shutdown () {
44- if (affinityThreadPool != null ) {
45- affinityThreadPool .shutdown ();
126+ if (affinityWorldAndRegionPool != null ) {
127+ affinityWorldAndRegionPool .shutdown ();
128+ try {
129+ if (!affinityWorldAndRegionPool .awaitTermination (5 , TimeUnit .SECONDS )) {
130+ affinityWorldAndRegionPool .shutdownNow ();
131+ }
132+ } catch (InterruptedException e ) {
133+ affinityWorldAndRegionPool .shutdownNow ();
134+ Thread .currentThread ().interrupt ();
135+ }
136+ if (affinityWorldAndRegionPool .getThreadFactory () instanceof AffinityThreadFactory factory ) {
137+ factory .releaseAllCores ();
138+ }
139+ }
140+
141+ if (affinitySharedPool != null ) {
142+ affinitySharedPool .shutdown ();
46143 try {
47- if (!affinityThreadPool .awaitTermination (5 , TimeUnit .SECONDS )) {
48- affinityThreadPool .shutdownNow ();
144+ if (!affinitySharedPool .awaitTermination (5 , TimeUnit .SECONDS )) {
145+ affinitySharedPool .shutdownNow ();
49146 }
50147 } catch (InterruptedException e ) {
51- affinityThreadPool .shutdownNow ();
148+ affinitySharedPool .shutdownNow ();
52149 Thread .currentThread ().interrupt ();
53150 }
54151
55- if (affinityThreadPool .getThreadFactory () instanceof AffinityThreadFactory factory ) {
152+ if (affinitySharedPool .getThreadFactory () instanceof AffinityThreadFactory factory ) {
56153 factory .releaseAllCores ();
57154 }
58155 }
0 commit comments