2828import java .util .concurrent .ConcurrentHashMap ;
2929import java .util .concurrent .ExecutorService ;
3030import java .util .concurrent .Executors ;
31+ import java .util .concurrent .TimeUnit ;
3132import java .util .function .Function ;
3233import java .util .logging .Level ;
3334import java .util .regex .Pattern ;
3435
3536public class I18n implements net .ess3 .api .II18n {
3637 private static final String MESSAGES = "messages" ;
3738 private static final Pattern NODOUBLEMARK = Pattern .compile ("''" );
38- private static final ExecutorService BUNDLE_LOADER_EXECUTOR = Executors .newFixedThreadPool (2 );
39+ private static volatile ExecutorService BUNDLE_LOADER_EXECUTOR = Executors .newFixedThreadPool (2 );
3940 private static final ResourceBundle NULL_BUNDLE = new ResourceBundle () {
4041 @ SuppressWarnings ("NullableProblems" )
4142 public Enumeration <String > getKeys () {
@@ -106,6 +107,29 @@ public void onEnable() {
106107
107108 public void onDisable () {
108109 instance = null ;
110+ shutdownExecutor ();
111+ }
112+
113+ private static synchronized ExecutorService getExecutor () {
114+ if (BUNDLE_LOADER_EXECUTOR == null || BUNDLE_LOADER_EXECUTOR .isShutdown () || BUNDLE_LOADER_EXECUTOR .isTerminated ()) {
115+ BUNDLE_LOADER_EXECUTOR = Executors .newFixedThreadPool (2 );
116+ }
117+ return BUNDLE_LOADER_EXECUTOR ;
118+ }
119+
120+ private static synchronized void shutdownExecutor () {
121+ final ExecutorService exec = BUNDLE_LOADER_EXECUTOR ;
122+ if (exec == null ) {
123+ return ;
124+ }
125+ exec .shutdown ();
126+ try {
127+ if (!exec .awaitTermination (5 , TimeUnit .SECONDS )) {
128+ exec .shutdownNow ();
129+ }
130+ } catch (final InterruptedException ignored ) {
131+ exec .shutdownNow ();
132+ }
109133 }
110134
111135 @ Override
@@ -124,7 +148,7 @@ private ResourceBundle getBundle(final Locale locale) {
124148 synchronized (loadingBundles ) {
125149 if (!loadingBundles .contains (locale )) {
126150 loadingBundles .add (locale );
127- BUNDLE_LOADER_EXECUTOR .submit (() -> {
151+ getExecutor () .submit (() -> {
128152 blockingLoadBundle (locale );
129153 synchronized (loadingBundles ) {
130154 loadingBundles .remove (locale );
0 commit comments