diff --git a/forge-core/src/main/java/forge/util/ThreadUtil.java b/forge-core/src/main/java/forge/util/ThreadUtil.java index 4ec6fb0f0a9..fd49e51506e 100644 --- a/forge-core/src/main/java/forge/util/ThreadUtil.java +++ b/forge-core/src/main/java/forge/util/ThreadUtil.java @@ -20,10 +20,8 @@ public class ThreadUtil { } } - // Use a single game thread, rather than a pool of them, because when something - // needs to execute on the game thread, it's because it's not thread safe. - private final static ExecutorService gameThread = Executors.newSingleThreadExecutor(new WorkerThreadFactory("Game")); - private static ExecutorService getGameThreadPool() { return gameThread; } + private final static ExecutorService gameThreadPool = Executors.newCachedThreadPool(new WorkerThreadFactory("Game")); + private static ExecutorService getGameThreadPool() { return gameThreadPool; } private final static ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2, new WorkerThreadFactory("Delayed")); private static ScheduledExecutorService getScheduledPool() { return scheduledPool; } diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 9033cf40cba..4c48620686b 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -298,7 +298,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { // System.out.println("Chosen sa=" + chosen + " of " + chosen.getHostCard() + " to pay mana"); locked = true; - runOnGameThread(game, new Runnable() { + game.getAction().invoke(new Runnable() { @Override public void run() { HumanPlay.playSpellAbility(getController(), chosen.getActivatingPlayer(), chosen); @@ -390,7 +390,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { } }; //must run in game thread as certain payment actions can only be automated there - runOnGameThread(game, new Runnable() { + game.getAction().invoke(new Runnable() { @Override public void run() { runAsAi(proc); diff --git a/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java b/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java index cbaef2848fc..9ca2f6ce712 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java @@ -4,23 +4,14 @@ import java.util.concurrent.CountDownLatch; import forge.FThreads; import forge.error.BugReporter; -import forge.game.Game; import forge.player.PlayerControllerHuman; -import forge.util.ThreadUtil; public abstract class InputSyncronizedBase extends InputBase implements InputSynchronized { private static final long serialVersionUID = 8756177361251703052L; - private CountDownLatch cdlDone; - - private boolean waitingOnGameThread; - private Runnable runnableToRun; + private final CountDownLatch cdlDone; public InputSyncronizedBase(final PlayerControllerHuman controller) { super(controller); - reset(); - } - - private void reset() { cdlDone = new CountDownLatch(1); } @@ -40,30 +31,8 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } public void showAndWait() { - waitingOnGameThread = ThreadUtil.isGameThread(); - getController().getInputQueue().setInput(this); awaitLatchRelease(); - - while (runnableToRun != null) { - Runnable r = runnableToRun; - runnableToRun = null; - - reset(); - r.run(); - - awaitLatchRelease(); - } - } - - protected final void runOnGameThread(Game game, Runnable r) { - if (waitingOnGameThread) { - runnableToRun = r; - cdlDone.countDown(); - return; - } - - game.getAction().invoke(r); } protected final void stop() {