一、通过实现Callable接口,实现线程体!然后传入线程池(submit可以提交,execut()不行)中,通过Future接收
1、显示Callable接口
import java.util.concurrent.Callable;
public class CallableTest implements Callable<String> {
@Override
public String call() throws Exception {
for (int i = 0;i < 20;i++){
System.out.println(i);
Thread.sleep(500);
}
String string="CallableTest执行线程结束";
return string;
}
}
2、Future接收
public static void main(String[] args) {
CallableTest callableTest = new CallableTest();
ExecutorService executorService=Executors.newCachedThreadPool();
Future future= executorService.submit(callableTest);
System.out.println("不被阻塞111");//不被阻塞
Future future1= executorService.submit(callableTest);
System.out.println("不被阻塞222");//不被阻塞
Future future2= executorService.submit(callableTest);
try {
System.out.println("future1.isDone()="+future1.isDone());//被阻塞
System.out.println(future.get());
System.out.println("被阻塞333");//被阻塞
System.out.println(future1.get());
System.out.println("被阻塞444");//被阻塞
System.out.println(future2.get());
System.out.println("被阻塞555");//被阻塞
System.out.println("future1.isDone()="+future1.isDone());//被阻塞
} catch (Exception e) {
e.printStackTrace();
}
}
二、拆分业务之后的多线程最后的返回结果合并:用一个list来接收各个future就好了!
public static void main(String[] args) {
CallableTest callableTest = new CallableTest();
ExecutorService executorService=Executors.newFixedThreadPool(5);
Future future= executorService.submit(callableTest);
Future future1= executorService.submit(callableTest);
Future future2= executorService.submit(callableTest);
List<Future> list=new ArrayList<>();
try {
list.add(future);
list.add(future1);
list.add(future2);
for(Future f:list) {
System.out.println(f.get());
}
} catch (Exception e) {
e.printStackTrace();
}
}
三、其实对于多个线程合并,current包还提供了如下几个方法进行合并:好多....: http://www.cnblogs.com/dennyzhangdd/p/7010972.html
1、 CountDownLatch用法/CyclicBarrier用法/Semaphore用法【计数器法则】
2、FutureTask、RunnableFuture
3、CompletionService
4、CompletableFuture