diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java index c6c3a4565..4097227a1 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java @@ -24,6 +24,8 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import org.jackhuang.hellominecraft.util.logging.HMCLog; /** @@ -64,40 +66,36 @@ public class TaskList extends Thread { return totTask; } - private class InvokeThread extends Thread { + private class Invoker implements Runnable { Task task; - Set s; + Set s; - public InvokeThread(Task task, Set ss) { + public Invoker(Task task, Set ss) { this.task = task; s = ss; - setDaemon(true); } @Override public void run() { executeTask(task); s.remove(this); - THREAD_POOL.remove(this); } } - static final Set THREAD_POOL = Collections.synchronizedSet(new HashSet()); - static final Set TASK_POOL = Collections.synchronizedSet(new HashSet()); + static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(64); private void processTasks(Collection c) { if (c == null || c.isEmpty()) return; this.totTask += c.size(); - Set runningThread = Collections.synchronizedSet(new HashSet()); + Set runningThread = Collections.synchronizedSet(new HashSet()); for (Task t2 : c) { t2.setParallelExecuting(true); - InvokeThread thread = new InvokeThread(t2, runningThread); - THREAD_POOL.add(thread); + Invoker thread = new Invoker(t2, runningThread); runningThread.add(thread); - thread.start(); + EXECUTOR_SERVICE.execute(thread); } while (!runningThread.isEmpty()) try { @@ -153,7 +151,6 @@ public class TaskList extends Thread { public void run() { Thread.currentThread().setName("TaskList"); - THREAD_POOL.clear(); totTask = taskQueue.size(); while (!taskQueue.isEmpty()) executeTask(taskQueue.remove(0)); @@ -168,13 +165,7 @@ public class TaskList extends Thread { public void abort() { shouldContinue = false; - while (!THREAD_POOL.isEmpty()) - synchronized (THREAD_POOL) { - InvokeThread it = THREAD_POOL.iterator().next(); - if (!it.task.abort()) - it.interrupt(); - THREAD_POOL.remove(it); - } + EXECUTOR_SERVICE.shutdownNow(); this.interrupt(); } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index 6bafe2135..1832a2bf9 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -154,6 +154,8 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev File tempFile = new File(filePath.getAbsolutePath() + ".hmd"); if (!tempFile.exists()) tempFile.createNewFile(); + else if (!tempFile.renameTo(tempFile)) // check file lock + throw new RuntimeException("The temp file is locked, maybe there is an application using the file?"); // Open file and seek to the end of it. file = new RandomAccessFile(tempFile, "rw");