diff --git a/bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java b/bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java index 91a3bda62fb..92f2a2d2ea6 100644 --- a/bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java +++ b/bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java @@ -25,6 +25,8 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; @@ -70,6 +72,8 @@ class AsyncCompletionProposalPopup extends CompletionProposalPopup { private PopupVisibleTimer fPopupVisibleTimer= new PopupVisibleTimer(); + private ExecutorService completionFuturesExecutor; + private static final class ComputingProposal implements ICompletionProposal, ICompletionProposalExtension { private final int fOffset; @@ -341,6 +345,9 @@ void createProposalSelector() { void cancelFutures() { toCancelFutures.forEach(future -> future.cancel(true)); toCancelFutures.clear(); + if (completionFuturesExecutor != null) { + completionFuturesExecutor.shutdownNow(); + } } @Override @@ -371,6 +378,8 @@ protected List>> buildCompletionFutu return Collections.emptyList(); } List>> futures = new ArrayList<>(processors.size()); + completionFuturesExecutor= Executors.newSingleThreadExecutor(); + for (IContentAssistProcessor processor : processors) { futures.add(CompletableFuture.supplyAsync(() -> { AtomicReference> result= new AtomicReference<>(); @@ -389,7 +398,7 @@ protected List>> buildCompletionFutu return Collections.emptyList(); } return proposals; - })); + }, completionFuturesExecutor)); } return futures; }