4.6 在一个执行器中删除一个任务
当你使用Executor时,你没有必要管理线程,因为它已经帮我们管理了线程。你仅仅需要实现Runnable或者Callable任务并发送它们给这个执行器executor。这个executor负责在线程池中创建、管理线程,并且如果它们不需要了,直接结束这些线程。有时,你可能想去删除一个你已经发送给executor的任务。这种情况,你直接调用Future对象的cancel()方法就可以了,它实现就得就是删除操作。请看下面的这个实例。
importjava.util.concurrent.Callable; import java.util.concurrent.Executors; import java.util.concurrent.Future; importjava.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class Task implements Callable<String>{ /** * Main method of the task. It has an infiniteloop that writes a message to * the console every 100 milliseconds */ @Override public String call() throws Exception { while (true){ System.out.printf("Task: Test\n"); Thread.sleep(100); } } /** * @param args */ public staticvoidmain(String[] args) { // Create an executor ThreadPoolExecutorexecutor=(ThreadPoolExecutor)Executors.newCachedThreadPool(); // Create a task Task task=new Task(); System.out.printf("Main: Executing the Task\n"); // Send the task to the executor Future<String>result=executor.submit(task); // Sleep during two seconds try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } // Cancel the task, finishing its execution System.out.printf("Main: Cancelling the Task\n"); result.cancel(true); // Verify that the task has been cancelled System.out.printf("Main: Cancelled: %s\n",result.isCancelled()); System.out.printf("Main: Done: %s\n",result.isDone()); // Shutdown the executor executor.shutdown(); System.out.printf("Main: The executor has finished\n"); } }
运行结果:
Main:Executing the Task Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Task:Test Main:Cancelling the Task Main:Cancelled: true Main:Done: true Main: The executor has finished