1。 用Executors创建threadpool ,并交由ExecutorService来管理。然后调用ExecutorService.submit 来执行具体的task返回是Future,同坐Future.get(). 便可以 拿到Future的返回值。或者是用ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks)来执行tasklist。
Executors 提供如下两个API来创建线程池
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory):通过threadFactory来创建线程,但线程的数目达到指定数量 后仍有新的task到达,将不会在创建新的线程,而是等待空闲的线程。
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory): 通过threadFactory来创建线程,如果有空闲的线程会先复用先前的线程, 没有空闲的则会创建新的线程。
eg: ExecutorService qafThreadPool = Executors.newCachedThreadPool(threadFactory);
2。创建线程(继承线程,或者实现ruanable或这callable,实现callable可以有返回值并且可以抛出checked exception)
private class callAbleTask implements Callable<Double[]>{ @Override public Double[] call() throws Exception { Double[] d = ****;
return d; } }
3。通过Future来取回异步计算的结果。通过 ExecutorService.submit(Callable<Double[]> task)来返回Future 对象。
Future<Double[]> f = ExecutorService.submit(callAbleTask );
4。通过 ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throwsInterruptedException来执行先前定义好的多个task。
我无所事事的度过了今天,是昨天死去的人们所期望的明天。