java-通过多线程展开并行递归计算

1、当每个迭代彼此独立,并且完成循环体中每个迭代的工作,意义都足够重大,足以弥补管理一个新任务的开销时,这个顺序循环是适合并行化的。

2、

public<T> voidParallelRecursive(final Executorexec,List<Node<T>>nodes,Collection<T> results){

    for(Node<T> n:nodes){

      exec.execute(new Runnable(){

             public void run(){

                 results.add(n.compute());

             }

      });

       parallelRecursive(exec,n.getChildren(),results);

    }

}

public<T>Collection<T>getParallelResults(List<Node<T>>nodes)

    throws InterruptedException{

      ExecutorService exec=Executors.newCachedThreadPool();

      Queue<T> resultQueue=newConcurrentLinkedQueue<T>();

      parallelRecursive(exec,nodes,resultQueue);

      exec.shutdown();

      exec.awaitTermination(Long.MAX_VALUE,TimeUnit.SECONDS);

      return reslutQueue;

}

但是以上程序不能处理不存在任何方案的情况,而下列程序可以解决这个问题

public class PuzzleSolver<P,M>extendsConcurrentPuzzleSolver<P,M>{

    ...

    privatefinal AtomicInteger taskCount=new AtomicInteger(0);

   

    protectedRunnable newTask(P p,M m,Node<P,M>n){

       return new CountingSolverTask(p,m,n);

    }

    

    classCountingSolverTask extends SolverTask{

       CountingSolverTask(P pos,Mmove,Node<P,M> prev){

            super(pos,move,prev);

           taskCount.incrementAndGet();

       }

        publicvoid run(){

          try{

              super.run();

          }

          finally{

             if (taskCount.decrementAndGet()==0)

                 solution.setValue(null);

          }

       }

    }

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值