Java 并发编程实战学习笔记——路径查找类型并行任务的终止
来源:互联网 发布:centos ssh连接其他ip 编辑:程序博客网 时间:2024/06/05 16:29
1.该类问题的递归串行算法(深度优先遍历)
2.该类问题的并行算法(CountDownLatch 用作一个简单的开/关锁存器)
广度优先算法
该段代码有个问题,就是不能够感知到该问题没有答案。
因此可以改为,可以感知到任务不存在的解决中
代码 复制 - 运行
package net.jcip.examples; import java.util.*; /** * SequentialPuzzleSolver * <p/> * Sequential puzzle solver * * @author Brian Goetz and Tim Peierls */ public class SequentialPuzzleSolver <P, M> { private final Puzzle<P, M> puzzle; private final Set<P> seen = new HashSet<P>(); public SequentialPuzzleSolver(Puzzle<P, M> puzzle) { this.puzzle = puzzle; } public List<M> solve() { P pos = puzzle.initialPosition(); return search(new PuzzleNode<P, M>(pos, null, null)); } private List<M> search(PuzzleNode<P, M> node) { if (!seen.contains(node.pos)) { seen.add(node.pos); if (puzzle.isGoal(node.pos)) return node.asMoveList(); for (M move : puzzle.legalMoves(node.pos)) { P pos = puzzle.move(node.pos, move); PuzzleNode<P, M> child = new PuzzleNode<P, M>(pos, move, node); List<M> result = search(child); if (result != null) return result; } } return null; } }
2.该类问题的并行算法(CountDownLatch 用作一个简单的开/关锁存器)
广度优先算法
代码 复制 - 运行
package net.jcip.examples; import java.util.concurrent.*; /** * ValueLatch * <p/> * Result-bearing latch used by ConcurrentPuzzleSolver * * @author Brian Goetz and Tim Peierls */ @ThreadSafe public class ValueLatch <T> { @GuardedBy("this") private T value = null; private final CountDownLatch done = new CountDownLatch(1); public boolean isSet() { return (done.getCount() == 0); } public synchronized void setValue(T newValue) { if (!isSet()) { value = newValue; done.countDown(); } } public T getValue() throws InterruptedException { done.await(); synchronized (this) { return value; } } }
代码 复制 - 运行
package net.jcip.examples; import java.util.*; import java.util.concurrent.*; /** * ConcurrentPuzzleSolver * <p/> * Concurrent version of puzzle solver * * @author Brian Goetz and Tim Peierls */ public class ConcurrentPuzzleSolver <P, M> { private final Puzzle<P, M> puzzle; private final ExecutorService exec; private final ConcurrentMap<P, Boolean> seen; protected final ValueLatch<PuzzleNode<P, M>> solution = new ValueLatch<PuzzleNode<P, M>>(); public ConcurrentPuzzleSolver(Puzzle<P, M> puzzle) { this.puzzle = puzzle; this.exec = initThreadPool(); this.seen = new ConcurrentHashMap<P, Boolean>(); if (exec instanceof ThreadPoolExecutor) { ThreadPoolExecutor tpe = (ThreadPoolExecutor) exec; tpe.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); } } private ExecutorService initThreadPool() { return Executors.newCachedThreadPool(); } public List<M> solve() throws InterruptedException { try { P p = puzzle.initialPosition(); exec.execute(newTask(p, null, null)); // block until solution found PuzzleNode<P, M> solnPuzzleNode = solution.getValue(); return (solnPuzzleNode == null) ? null : solnPuzzleNode.asMoveList(); } finally { exec.shutdown(); } } protected Runnable newTask(P p, M m, PuzzleNode<P, M> n) { return new SolverTask(p, m, n); } protected class SolverTask extends PuzzleNode<P, M> implements Runnable { SolverTask(P pos, M move, PuzzleNode<P, M> prev) { super(pos, move, prev); } public void run() { if (solution.isSet() || seen.putIfAbsent(pos, true) != null) return; // already solved or seen this position if (puzzle.isGoal(pos)) solution.setValue(this); else for (M m : puzzle.legalMoves(pos)) exec.execute(newTask(puzzle.move(pos, m), m, this)); } } }
该段代码有个问题,就是不能够感知到该问题没有答案。
因此可以改为,可以感知到任务不存在的解决中
代码 复制 - 运行
package net.jcip.examples; import java.util.concurrent.atomic.*; /** * PuzzleSolver * <p/> * Solver that recognizes when no solution exists * * @author Brian Goetz and Tim Peierls */ public class PuzzleSolver <P,M> extends ConcurrentPuzzleSolver<P, M> { PuzzleSolver(Puzzle<P, M> puzzle) { super(puzzle); } private final AtomicInteger taskCount = new AtomicInteger(0); protected Runnable newTask(P p, M m, PuzzleNode<P, M> n) { return new CountingSolverTask(p, m, n); } class CountingSolverTask extends SolverTask { CountingSolverTask(P pos, M move, PuzzleNode<P, M> prev) { super(pos, move, prev); taskCount.incrementAndGet(); } public void run() { try { super.run(); } finally { if (taskCount.decrementAndGet() == 0) solution.setValue(null); } } } }
- Java 并发编程实战学习笔记——路径查找类型并行任务的终止
- Java 并发编程实战学习笔记——串行任务转并行任务
- Java 并发编程实战学习笔记——寻找可强化的并行性
- C++并发编程实战chapter1你好,C++的并发世界--笔记1--任务并行和数据并行
- Java并发编程实战笔记_并发任务执行
- Java并发编程实战笔记_并发任务执行
- 并发编程实战学习笔记(四)——任务执行
- Java 并发编程实战学习笔记——CountDownLatch的使用
- java并发编程实战-构建高效的并行计算
- Java 并发编程实战学习笔记
- Java并发编程实战(学习笔记五 第六章 任务执行)
- 《Java并发编程实战》学习笔记 任务执行和取消关闭
- java并发编程实战笔记(二)任务取消
- Java并发编程实战笔记(5)-任务执行
- Java并发编程学习——《Java Concurrency in Practice》学习笔记 6.任务执行
- Java并发编程实战(学习笔记十一 第十二章 并发程序的测试)
- 《Java并发编程实战》笔记
- java并发编程实战笔记
- WIN7删除文件不进回收站
- hdu 4770 Lights Against Dudely (2013亚洲区域赛杭州站 A)
- 用SQL语句更改数据库名,表名,列名
- linux 一个简单的WEB服务器
- MVC 安全性 : 重定向
- Java 并发编程实战学习笔记——路径查找类型并行任务的终止
- c# Dns.GetHostAddresses获取ip为乱码
- ios开发随笔记(一)
- Integrated Development Environments / RAD tools / GUI-builders on Linux
- ViewPager+Fragment的结合使用,实现QQ界面的理解
- Java 并发编程实战学习笔记——CountDownLatch的使用
- 创维32/37寸LED电视(LG V6屏)通用电源
- Django中扩展User模型
- 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签