package concurrency; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class TaskWithResult implements Callable<String> { private int id; public TaskWithResult(int id) { this.id = id; } @Override public String call() throws Exception { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); return "result of TaskWithResult " + id; } } public class CallableDemo { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for (int i = 0; i < 10; i++) { results.add(exec.submit(new TaskWithResult(i))); } // 调用 shutdown() 方法。ExecutorService // 并不会马上关闭,而是不再接收新的任务,壹但所有的线程结束执行当前任务,ExecutorServie 才会真的关闭。所有在调用 // shutdown() 方法之前提交到 ExecutorService 的任务都会执行。 exec.shutdown(); // 立即关闭 ExecutorService,你可以调用 shutdownNow() // 方法。这個方法会尝试马上关闭所有正在执行的任务,并且跳过所有已经提交但是还没有运行的任务。但是对于正在执行的任务,是否能够成功关闭它是无法保证的,有可能他们真的被关闭掉了,也有可能它会壹直执行到任务结束。这是壹個最好的尝试。 exec.shutdownNow(); // exec.wait(5000); for (Future<String> fs : results) { try { System.out.println(fs.get()); } catch (InterruptedException e) { System.out.println(e); } catch (ExecutionException e) { System.out.println(e); } finally { exec.shutdown(); } } } }
时间: 2024-10-05 04:54:53