当前位置: 首页 > news >正文

深圳做微商网站的公司网站策划书格式及范文

深圳做微商网站的公司,网站策划书格式及范文,网上开小店怎么开,免费网站建设视频教程是什么 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架#xff0c;是一个把大任务分割成若干个小任务#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 Fork: 把一个大任务切分为若干子任务并行的执行 Join: 合并这些子任务的执行结果#xff0c;最后…是什么 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架是一个把大任务分割成若干个小任务最终汇总每个小任务结果后得到大任务结果的框架。 Fork: 把一个大任务切分为若干子任务并行的执行 Join: 合并这些子任务的执行结果最后得到这个大任务的结果。 运行流程图 工作窃取算法 工作窃取work-stealing算法是指某个线程从其他队列里窃取任务来执行。 做一个比较大的任务可以把这个任务分割为若干互不依赖的子任务为了减少线程间的竞争把这些子任务分别放到不同的队列里并为每个队列创建一个单独的线程来执行队列里的任务线程和队列一一对应。有的线程会先把自己队列里的任务干完而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着不如去帮其他线程干活于是它就去其他线程的队列里窃取一个任务来执行。 为了减少窃取任务线程和被窃取任务线程之间的竞争通常会使用双端队列被窃取任务线程永远从双端队列的头部拿任务执行而窃取任务的线程永远从双端队列的尾部拿任务执行。 工作窃取流程 工作窃取算法的优缺点 优点充分利用线程进行并行计算减少了线程间的竞争。 缺点在某些情况下还是存在竞争比如双端队列里只有一个任务时。并且该算法会消耗了更多的系统资源比如创建多个线程和多个双端队列。 Fork/Join框架的设计 步骤1 分割任务。需要有一个fork类来把大任务分割成子任务有可能子任务还是很大所以还需要不停地分割直到分割出的子任务足够小。 步骤2 执行任务并合并结果。分割的子任务分别放在双端队列里然后启动几个线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里启动一个线程从队列里拿数据然后合并这些数据。 Fork/Join使用两个类来完成以上两件事情。 ForkJoinTask要使用ForkJoin框架必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制。不需要直接继承ForkJoinTask类只需要继承它的子类Fork/Join框架提供了以下两个子类。 RecursiveAction用于没有返回结果的任务。RecursiveTask用于有返回结果的任务。 ForkJoinPoolForkJoinTask需要通过ForkJoinPool来执行。 任务分割出的子任务会添加到当前工作线程所维护的双端队列中进入队列的头部。当一个工作线程的队列里暂时没有任务时它会随机从其他工作线程的队列的尾部获取一个任务。 Fork/Join框架基本使用 需求计算1234的结果。 使用Fork/Join框架首先要考虑到的是如何分割任务上述需求希望每个子任务最多执行两个数相加因此分割阈值设置为2。 有返回结果的任务所以必须继承RecursiveTask 示例代码如下 public class CountTask extends RecursiveTaskInteger {/*** 阈值*/private static final int THRESHOLD 2;private int start;private int end;public CountTask(int start, int end) {this.start start;this.end end;}Overrideprotected Integer compute() {int sum 0;// 如果任务足够小就计算任务boolean canCompute (end - start) THRESHOLD;if (canCompute) {for (int i start; i end; i) {sum i;}} else {// 如果任务大于阈值就分割成两个子任务计算int middle (start end) / 2;CountTask leftTask new CountTask(start, middle);CountTask rightTask new CountTask(middle 1, end);// 执行子任务leftTask.fork();rightTask.fork();// 等待子任务执行完并得到其结果int leftResult leftTask.join();int rightResult rightTask.join();// 合并子任务sum leftResult rightResult;}return sum;}public static void main(String[] args) {ForkJoinPool forkJoinPool new ForkJoinPool();// 生成一个计算任务负责计算1234CountTask task new CountTask(1, 4);// 执行一个任务FutureInteger result forkJoinPool.submit(task);try {System.out.println(result.get());} catch (InterruptedException | ExecutionException e) {throw new RuntimeException();}} }ForkJoinTask与一般任务的主要区别在于它需要实现compute方法需要判断任务是否足够小小于阈值如果足够小就直接执行任务。如果不足够小就必须分割成两个子任务每个子任务在调用fork方法时又会进入compute方法看看当前子任务是否需要继续分割成子任务如果不需要继续分割则执行当前子任务并返回结果。 使用join方法会等待子任务执行完并得到其结果。 Fork/Join框架的异常处理 ForkJoinTask在执行的时候可能会抛出异常但是没办法在主线程里直接捕获异常所以ForkJoinTask提供了isCompletedAbnormally()方法来检查任务是否已经抛出异常或已经被取消了并且可以通过ForkJoinTask的getException方法获取异常。 if(task.isCompletedAbnormally()){System.out.println(task.getException());}getException方法返回Throwable对象如果任务被取消了则返回CancellationException。如果任务没有完成或者没有抛出异常则返回null。 Fork/Join框架的实现原理 ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成ForkJoinTask数组负责将存放程序提交给ForkJoinPool的任务而ForkJoinWorkerThread数组负责执行这些任务。 工作队列 static final class WorkQueue {static final int INITIAL_QUEUE_CAPACITY 1 13;static final int MAXIMUM_QUEUE_CAPACITY 1 26; // 64M// Instance fieldsvolatile int scanState; // versioned, 0: inactive; odd:scanningint stackPred; // pool stack (ctl) predecessorint nsteals; // number of stealsint hint; // randomization and stealer index hintint config; // pool index and modevolatile int qlock; // 1: locked, 0: terminate; else 0volatile int base; // index of next slot for pollint top; // index of next slot for pushForkJoinTask?[] array; // the elements (initially unallocated)final ForkJoinPool pool; // the containing pool (may be null)final ForkJoinWorkerThread owner; // owning thread or null if sharedvolatile Thread parker; // owner during call to park; else nullvolatile ForkJoinTask? currentJoin; // task being joined in awaitJoinvolatile ForkJoinTask? currentSteal; // mainly used by helpStealer// ... }1ForkJoinTask的fork方法实现原理 调用ForkJoinTask的fork方法时程序会将任务丢到任务队列里然后立即返回结果。 public final ForkJoinTaskV fork() {Thread t;if ((t Thread.currentThread()) instanceof ForkJoinWorkerThread)((ForkJoinWorkerThread)t).workQueue.push(this);elseForkJoinPool.common.externalPush(this);return this;}static final ForkJoinPool common; ForkJoinPool.common.externalPush(this);final void externalPush(ForkJoinTask? task) {WorkQueue[] ws; WorkQueue q; int m;int r ThreadLocalRandom.getProbe();int rs runState;if ((ws workQueues) ! null (m (ws.length - 1)) 0 (q ws[m r SQMASK]) ! null r ! 0 rs 0 U.compareAndSwapInt(q, QLOCK, 0, 1)) {ForkJoinTask?[] a; int am, n, s;if ((a q.array) ! null (am a.length - 1) (n (s q.top) - q.base)) {int j ((am s) ASHIFT) ABASE;U.putOrderedObject(a, j, task);U.putOrderedInt(q, QTOP, s 1);U.putIntVolatile(q, QLOCK, 0);if (n 1)signalWork(ws, q);return;}U.compareAndSwapInt(q, QLOCK, 1, 0);}externalSubmit(task);}上述代码把当前任务存放在ForkJoinTask数组队列里。然后再调用ForkJoinPool的signalWork()方法唤醒或创建一个工作线程来执行任务。 2ForkJoinTask的join方法实现原理 Join方法的主要作用是阻塞当前线程并等待获取结果。代码如下 public final V join() {int s;if ((s doJoin() DONE_MASK) ! NORMAL)reportException(s);return getRawResult();}private void reportException(int s) {if (s CANCELLED)throw new CancellationException();if (s EXCEPTIONAL)rethrow(getThrowableException());}调用了doJoin()方法通过doJoin()方法得到当前任务的状态与运算来判断返回什么结果任务状态有4种已完成NORMAL、被取消CANCELLED、信号SIGNAL和出现异常EXCEPTIONAL。 如果任务状态是已完成则直接返回任务结果。如果任务状态是被取消则直接抛出CancellationException。如果任务状态是抛出异常则直接抛出对应的异常。 doJoin()方法的实现代码。 private int doJoin() {int s; Thread t; ForkJoinWorkerThread wt; ForkJoinPool.WorkQueue w;return (s status) 0 ? s :((t Thread.currentThread()) instanceof ForkJoinWorkerThread) ?(w (wt (ForkJoinWorkerThread)t).workQueue).tryUnpush(this) (s doExec()) 0 ? s :wt.pool.awaitJoin(w, this, 0L) :externalAwaitDone();}final int doExec() {int s; boolean completed;if ((s status) 0) {try {completed exec();} catch (Throwable rex) {return setExceptionalCompletion(rex);}if (completed)s setCompletion(NORMAL);}return s;}首先通过查看任务的状态看任务是否已经执行完成如果执行完成则直接返回任务状态 如果没有执行完则从任务数组里取出任务并执行。如果任务顺利执行完成则设置任务状态为NORMAL如果出现异常则记录异常并将任务状态设置为EXCEPTIONAL。
http://www.tj-hxxt.cn/news/228168.html

相关文章:

  • wordpress的站点地址怎么设置文字变形logo设计
  • 二手交易平台网站的建设网站可以做被告嘛
  • 南宁网站seo大概多少钱seo的搜索排名影响因素有哪些
  • 南宁哪里有做网站的公司设计企业网店推广策略
  • 国外专业做汽配的网站广州网站建设 中网科技
  • 石家庄做网站推广排名的公司中国优秀网页设计案例
  • 网站建设门户wordpress 注册邮箱
  • 医疗机构网站备案asp网站源码下载
  • 用自己的电脑做网站服务器优化网站的技巧
  • 潍坊作风建设网站内部网站的作用
  • 做网站挣钱来个好心人指点一下呗网页制作q元素
  • 做网站要学什么软件黑蒜东莞网站建设
  • 电子商务网站用户协议百度认证平台
  • 东台网站网站建设网站开发和ipv6
  • 湛江制作企业网站信息发布网站建设
  • 网店平台网站建设需求wordpress建站的教程
  • 清华大学绿色大学建设网站微官网建设公司排行
  • 怎么做北京赛网站安徽六安发现一例新冠阳性检测者
  • 天津都有哪些制作网站网站建设完整步骤
  • 网站建设对用户影响青海省建筑信息平台
  • mooc网站建设食品网站建设实施方案
  • 做网站报价出名的域名到期换个公司做网站
  • 建设局网站安徽虚拟主机怎么发布网站
  • 网站如何做导航条下拉菜单杭州手机网站建设公司 网络服务
  • 网站标题优化可以含几个关键词Wordpress翻译自定义链接
  • 把网站做成静态页面舆情分析系统
  • 网站建设工作室 需要营业执照吗免费企业logo设计
  • 建设局网站查询郑州网站服务公司
  • 教程seo推广排名网站定位网站关键词
  • 做一个微信小程序需要多少钱嘉兴做网站优化哪家好