package thread.pool; import java.util.concurrent.Callable; /** * Callable 和 Future接口 * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。 * Callable和Runnable有几点不同: * (1)Callable规定的方法是call(),而Runnable规定的方法是run(). * (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。 * (3)call()方法可抛出异常,而run()方法是不能抛出异常的。 * (4)运行Callable任务可拿到一个Future对象,Future 表示异步计算的结果。 * 它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。 * 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。 */ public class SayCallable implements Callable { private String taskname; private int taskflag = 0; public SayCallable(String name, int flag) { taskname = name; taskflag = flag; } public String call() throws Exception { if (taskflag == 0) { return taskname + ", flag = " + taskflag; } if (taskflag == 1 || taskflag == 2) { try { while (true) { System.out.println("hi"); Thread.sleep(200); } } catch (InterruptedException e) { System.out.println(taskname + ", exception = " + e.toString()); // 由于阻塞函数(wait, sleep, join 等函数)除了抛出异常外, // 还会清除线程中断状态,因此在这里要保留线程的中断状态。 Thread.currentThread().interrupt(); } return taskname + ", flag = " + taskflag; } else { return taskname + ", flag = " + taskflag; } } }
package thread.pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; public class Test { /** * @author jzh add 2011-12-21 * @param args */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { // 定义3个Callable类型的任务 SayCallable task1 = new SayCallable("task1", 0); SayCallable task2 = new SayCallable("task2", 1); SayCallable task3 = new SayCallable("task3", 1); // 创建一个线程池(指定线程数量为3) // Executors 类提供了用于此包中所提供的执行程序服务的工厂方法 ExecutorService pool = Executors.newFixedThreadPool(3); // 第一个任务 try { // 采用submit提交并执行任务,然后返回了一个Future对象。 Future future1 = pool.submit(task1); // 调用get方法,一直等待任务执行完毕返回结果,然后再往下执行。 System.out.println("task1: " + future1.get()); } catch (Exception e) { System.out.println("task1: exception = " + e.getMessage()); } // 第二个任务 try { Future future2 = pool.submit(task2); // 休眠1秒。 Thread.sleep(1000); // 取消任务的执行 System.out.println("task2: cancel = " + future2.cancel(true)); } catch (Exception e) { System.out.println("task2: cancel = " + e.getMessage()); } // 第三个任务 try { Future future3 = pool.submit(task3); // 等待1秒,超时后会抛出TimeoutException System.out.println("task3: " + future3.get(1, TimeUnit.SECONDS)); } catch (Exception e) { System.out.println("task3: " + e.toString()); } // 尝试停止所有正在执行的活动任务,暂停处理正在等待的任务。 pool.shutdownNow(); } }