本文共 1934 字,大约阅读时间需要 6 分钟。
Java线程池之FutureTask【Java线程池系列3】
在附录的文章2中,使用了Java的线程池和Future、Callable。本篇文章在文章2的基础上加以改进,基于FutureTask,换掉Future重新实现。
FutureTask既实现了Future,也实现了Runnable,所以更加的普适,用法和Future相类似。和附录的文章2代码写法类似,比如:package test_java;import java.util.ArrayList;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;public class ZhangPhilExecutorService { private final int POOL_SIZE = 5; private final int TOTAL_THREAD = 6; public ZhangPhilExecutorService() { // 创建容量为 POOL_SIZE 的线程池。 ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE); final ArrayList> futures = new ArrayList >(); for (int i = 0; i < TOTAL_THREAD; i++) { AThread t = new AThread(i); //在此处使用FutureTask实现,注意写法 FutureTask futureTask = new FutureTask (t); futures.add(futureTask); pool.submit(futureTask); } System.out.println("获取结果中..."); for (FutureTask f : futures) { try { // if (f.isDone()) System.out.println(f.get()); } catch (Exception e) { e.printStackTrace(); } } System.out.println("得到全部结果."); // 关闭线程池。 pool.shutdown(); } private class AThread implements Callable { private int id; public AThread(int id) { this.id = id; } @Override public String call() { System.out.println("线程:" + id + " -> 运行..."); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:" + id + " -> 结束"); return "返回的字符串" + id; } } public static void main(String[] args) { new ZhangPhilExecutorService(); }}
注意,FutureTask和Future在get返回值时候,都将阻塞,所以,为了避免阻塞,可以加一条判断语句isDone,完成了才get,否则不予get。另外,FutureTask还有Future在get的时候,还有一个相类似的方法体:
public V get(long timeout,TimeUnit unit); 可以设置超时时间,那么在get时候如果超时则返回,从另外一个途径实现非阻塞获取返回数据。附录我以前写的相关文章:
【文章1】《Java线程池:ExecutorService,Executors》链接地址: 【文章2】《Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】》链接地址:转载地址:http://nptyx.baihongyu.com/