使用示例:如有时我们需要一次插入大批量数据,那么可能我们需要将1w条数据分开插,异步执行。如果某个异步任务失败那么我们还要重插,那可以用CompletionService来实现。下面是简单代码:
(代码中1w条数据分成10份,每次插1000条,如果成功则返回true,如果失败则返回false。那么忽略数据库的东西,我们假设插1w条数据需10s,插1k条数据需1s,那么下面的代码分制后,插入10条数据需要2s。为什么是2s呢?因为我们开的线程池是8线程,10个异步任务就有两个需要等待池资源,所以是2s,如果将下面的8改为10,则只需要1s。)
- public class CompletionServiceTest {
-
- public static void main(String[] args) {
- ExecutorService pool = Executors.newFixedThreadPool(8);
- CompletionService<Boolean> cs = new ExecutorCompletionService<Boolean>(pool);
- Callable<Boolean> task = new Callable<Boolean>(){
- public Boolean call(){
- try {
- Thread.sleep(1000);
- System.out.println("插入1000条数据完成");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return true;
- };
- };
- System.out.println(getNow()+"--开始插入数据");
- for(int i=0;i<10;i++){
- cs.submit(task);
- }
- for(int i=0;i<10;i++){
- try {
-
- System.out.println(cs.take().get());
-
- } catch (InterruptedException|ExecutionException e) {
- e.printStackTrace();
- }
- }
- System.out.println(getNow()+"--插入数据完成");
- pool.shutdown();
- }
-
- public static String getNow(){
- SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
- return sdf.format(new Date());
- }
- }
from: http://blog.csdn.net/lh87522/article/details/45973373