From b72d42a09a70f70861c376346c1f3f406a08a6ae Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Wed, 19 Feb 2020 21:48:59 +0800 Subject: [PATCH] fix: task accidental disappearance --- .../hmcl/task/CancellableTaskExecutor.java | 6 +- .../org/jackhuang/hmcl/task/Schedulers.java | 61 ++----------------- .../java/org/jackhuang/hmcl/task/Task.java | 8 +-- 3 files changed, 12 insertions(+), 63 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/CancellableTaskExecutor.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/CancellableTaskExecutor.java index d362143a0..cfe9f1539 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/CancellableTaskExecutor.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/CancellableTaskExecutor.java @@ -193,7 +193,8 @@ public class CancellableTaskExecutor extends TaskExecutor { task.onDone().fireEvent(new TaskEvent(this, task, false)); taskListeners.forEach(it -> it.onFinished(task)); - } catch (RejectedExecutionException ignored) { + } catch (RejectedExecutionException e) { + Logging.LOG.log(Level.SEVERE, "Task rejected: " + task.getName(), e); } catch (Exception throwable) { Throwable resolved = resolveException(throwable); if (resolved instanceof Exception) { @@ -268,7 +269,8 @@ public class CancellableTaskExecutor extends TaskExecutor { @Override public void run() { try { - Thread.currentThread().setName(task.getName()); + if (task.getName() != null) + Thread.currentThread().setName(task.getName()); if (!executeTask(parentTask, task)) success.set(false); } finally { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java index 2eb8a0d12..f3f4260bc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java @@ -19,11 +19,9 @@ package org.jackhuang.hmcl.task; import javafx.application.Platform; import org.jackhuang.hmcl.util.Logging; -import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicReference; /** * @@ -50,7 +48,7 @@ public final class Schedulers { if (IO_EXECUTOR == null) IO_EXECUTOR = new ThreadPoolExecutor(6, 6, 60L, TimeUnit.SECONDS, - new SynchronousQueue<>(), + new LinkedBlockingQueue<>(), runnable -> { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setDaemon(true); @@ -99,59 +97,8 @@ public final class Schedulers { } public static Future schedule(Executor executor, Runnable command) { - if (executor instanceof ExecutorService) { - return ((ExecutorService) executor).submit(command); - } - - CountDownLatch latch = new CountDownLatch(1); - AtomicReference wrapper = new AtomicReference<>(); - - executor.execute(() -> { - try { - command.run(); - } catch (Exception e) { - wrapper.set(e); - } finally { - latch.countDown(); - } - Thread.interrupted(); // clear the `interrupted` flag to prevent from interrupting EventDispatch thread. - }); - - return new Future() { - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return latch.getCount() == 0; - } - - private Void getImpl() throws ExecutionException { - Exception e = wrapper.get(); - if (e != null) - throw new ExecutionException(e); - return null; - } - - @Override - public Void get() throws InterruptedException, ExecutionException { - latch.await(); - return getImpl(); - } - - @Override - public Void get(long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - if (!latch.await(timeout, unit)) - throw new TimeoutException(); - return getImpl(); - } - }; + FutureTask future = new FutureTask(command, null); + executor.execute(future); + return future; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java index 338427dcc..1188ab8a3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java @@ -94,7 +94,7 @@ public abstract class Task { * You must initialize stage in preExecute. * @param stage the stage */ - public void setStage(String stage) { + final void setStage(String stage) { this.stage = stage; } @@ -363,18 +363,18 @@ public abstract class Task { } public final TaskExecutor cancellableExecutor() { - return new AsyncTaskExecutor(this); + return new CancellableTaskExecutor(this); } public final TaskExecutor cancellableExecutor(boolean start) { - TaskExecutor executor = new AsyncTaskExecutor(this); + TaskExecutor executor = new CancellableTaskExecutor(this); if (start) executor.start(); return executor; } public final TaskExecutor cancellableExecutor(TaskListener taskListener) { - TaskExecutor executor = new AsyncTaskExecutor(this); + TaskExecutor executor = new CancellableTaskExecutor(this); executor.addTaskListener(taskListener); return executor; }