|
|
|
package com.fr.design.mainframe.theme;
|
|
|
|
|
|
|
|
import com.fr.base.theme.TemplateTheme;
|
|
|
|
import com.fr.base.theme.TemplateThemeConfig;
|
|
|
|
import com.fr.concurrent.NamedThreadFactory;
|
|
|
|
import com.fr.module.ModuleContext;
|
|
|
|
|
|
|
|
import javax.swing.SwingUtilities;
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Starryi
|
|
|
|
* @version 1.0
|
|
|
|
* Created by Starryi on 2021/8/24
|
|
|
|
*/
|
|
|
|
public class AsyncThemeFetcher<T extends TemplateTheme> {
|
|
|
|
|
|
|
|
private final ExecutorService executorService;
|
|
|
|
private final TemplateThemeConfig<T> config;
|
|
|
|
|
|
|
|
public AsyncThemeFetcher(int threads, TemplateThemeConfig<T> config) {
|
|
|
|
this.executorService = ModuleContext.getExecutor().newFixedThreadPool(
|
|
|
|
threads,
|
|
|
|
new NamedThreadFactory(this.getClass().getName())
|
|
|
|
);
|
|
|
|
this.config = config;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void shutdown() {
|
|
|
|
executorService.shutdown();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isShutdown() {
|
|
|
|
return executorService.isShutdown();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void submit(String themeName, AsyncThemeFetchCallback<T> callback) {
|
|
|
|
if (callback != null) {
|
|
|
|
callback.beforeCachedFetch();
|
|
|
|
}
|
|
|
|
executorService.submit(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
if (executorService.isShutdown()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
T theme = config.cachedFetch(themeName);
|
|
|
|
if (executorService.isShutdown()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (callback != null) {
|
|
|
|
// 后续任务不要在工作线程中执行,从而确保只在EDT线程操作UI
|
|
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
callback.afterCachedFetch(theme);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public interface AsyncThemeFetchCallback<T extends TemplateTheme> {
|
|
|
|
void beforeCachedFetch();
|
|
|
|
void afterCachedFetch(T theme);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class AsyncThemeFetchCallbackAdapter<T extends TemplateTheme> implements AsyncThemeFetchCallback<T> {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void beforeCachedFetch() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void afterCachedFetch(T theme) {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|