From 80e76ed541af5f3807bb03aad0f17a5d59218ece Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Thu, 6 Nov 2014 13:52:16 +0000 Subject: [PATCH] * optimize executors --- source/net/filebot/WebServices.java | 70 ++++++------------- .../filebot/ui/rename/EpisodeListMatcher.java | 23 +++--- .../ui/subtitle/SubtitleUploadDialog.java | 4 +- 3 files changed, 31 insertions(+), 66 deletions(-) diff --git a/source/net/filebot/WebServices.java b/source/net/filebot/WebServices.java index 720f3aa1..d558902f 100644 --- a/source/net/filebot/WebServices.java +++ b/source/net/filebot/WebServices.java @@ -128,6 +128,8 @@ public final class WebServices { return null; } + public static final ExecutorService requestThreadPool = Executors.newCachedThreadPool(); + public static class TheTVDBClientWithLocalSearch extends TheTVDBClient { public TheTVDBClientWithLocalSearch(String apikey) { @@ -166,48 +168,23 @@ public final class WebServices { return null; } - @SuppressWarnings("unchecked") @Override public List fetchSearchResult(final String query, final Locale locale) throws Exception { - Callable> apiSearch = new Callable>() { + Callable> apiSearch = () -> TheTVDBClientWithLocalSearch.super.fetchSearchResult(query, locale); + Callable> localSearch = () -> getLocalIndex().search(query); - @Override - public List call() throws Exception { - return TheTVDBClientWithLocalSearch.super.fetchSearchResult(query, locale); - } - }; - Callable> localSearch = new Callable>() { - - @Override - public List call() throws Exception { - try { - return getLocalIndex().search(query); - } catch (Exception e) { - Logger.getLogger(TheTVDBClientWithLocalSearch.class.getName()).log(Level.SEVERE, e.getMessage(), e); - } - - // let local search fail gracefully without affecting API search - return emptyList(); - } - }; - - ExecutorService executor = Executors.newFixedThreadPool(2); - try { - Set results = new LinkedHashSet(); - for (Future> resultSet : executor.invokeAll(asList(localSearch, apiSearch))) { - try { - results.addAll(resultSet.get()); - } catch (ExecutionException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); // unwrap cause - } + Set results = new LinkedHashSet(); + for (Future> resultSet : requestThreadPool.invokeAll(asList(localSearch, apiSearch))) { + try { + results.addAll(resultSet.get()); + } catch (ExecutionException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); // unwrap cause } } - return sortBySimilarity(results, singleton(query), getSeriesMatchMetric(), false); - } finally { - executor.shutdownNow(); } - }; + return sortBySimilarity(results, singleton(query), getSeriesMatchMetric(), false); + } } public static class AnidbClientWithLocalSearch extends AnidbClient { @@ -238,22 +215,17 @@ public final class WebServices { Callable> seriesSearch = () -> seriesIndex.search(query, Locale.ENGLISH); Callable> movieSearch = () -> movieIndex.searchMovie(query, Locale.ENGLISH); - ExecutorService executor = Executors.newFixedThreadPool(2); - try { - Set results = new LinkedHashSet(); - for (Future> resultSet : executor.invokeAll(asList(seriesSearch, movieSearch))) { - try { - results.addAll(resultSet.get()); - } catch (ExecutionException e) { - if (e.getCause() instanceof Exception) { - throw (Exception) e.getCause(); // unwrap cause - } + Set results = new LinkedHashSet(); + for (Future> resultSet : requestThreadPool.invokeAll(asList(seriesSearch, movieSearch))) { + try { + results.addAll(resultSet.get()); + } catch (ExecutionException e) { + if (e.getCause() instanceof Exception) { + throw (Exception) e.getCause(); // unwrap cause } } - return sortBySimilarity(results, singleton(query), new MetricAvg(getSeriesMatchMetric(), getMovieMatchMetric()), false); - } finally { - executor.shutdownNow(); } + return sortBySimilarity(results, singleton(query), new MetricAvg(getSeriesMatchMetric(), getMovieMatchMetric()), false); } @Override diff --git a/source/net/filebot/ui/rename/EpisodeListMatcher.java b/source/net/filebot/ui/rename/EpisodeListMatcher.java index e013ceed..2ad6acac 100644 --- a/source/net/filebot/ui/rename/EpisodeListMatcher.java +++ b/source/net/filebot/ui/rename/EpisodeListMatcher.java @@ -3,6 +3,7 @@ package net.filebot.ui.rename; import static java.util.Collections.*; import static net.filebot.MediaTypes.*; import static net.filebot.Settings.*; +import static net.filebot.WebServices.*; import static net.filebot.media.MediaDetection.*; import static net.filebot.util.FileUtilities.*; import static net.filebot.util.StringUtilities.*; @@ -150,23 +151,15 @@ class EpisodeListMatcher implements AutoCompleteMatcher { }); } - // fetch episode lists concurrently - ExecutorService executor = Executors.newCachedThreadPool(); + // fetch episode lists concurrently and merge all episodes + Set episodes = new LinkedHashSet(); - try { - // merge all episodes - Set episodes = new LinkedHashSet(); - - for (Future> future : executor.invokeAll(tasks)) { - episodes.addAll(future.get()); - } - - // all background workers have finished - return episodes; - } finally { - // destroy background threads - executor.shutdownNow(); + for (Future> future : requestThreadPool.invokeAll(tasks)) { + episodes.addAll(future.get()); } + + // all background workers have finished + return episodes; } @Override diff --git a/source/net/filebot/ui/subtitle/SubtitleUploadDialog.java b/source/net/filebot/ui/subtitle/SubtitleUploadDialog.java index 2c54e13e..70c1ee5b 100644 --- a/source/net/filebot/ui/subtitle/SubtitleUploadDialog.java +++ b/source/net/filebot/ui/subtitle/SubtitleUploadDialog.java @@ -72,7 +72,7 @@ public class SubtitleUploadDialog extends JDialog { private final OpenSubtitlesClient database; - private ExecutorService checkExecutorService = Executors.newFixedThreadPool(2); + private ExecutorService checkExecutorService = Executors.newSingleThreadExecutor(); private ExecutorService uploadExecutorService; public SubtitleUploadDialog(OpenSubtitlesClient database, Window owner) { @@ -282,7 +282,7 @@ public class SubtitleUploadDialog extends JDialog { return; } - uploadExecutorService = Executors.newFixedThreadPool(1); + uploadExecutorService = Executors.newSingleThreadExecutor(); SubtitleMapping[] data = ((SubtitleMappingTableModel) subtitleMappingTable.getModel()).getData(); for (final SubtitleMapping it : data) {