forkjoin

来源:互联网 发布:tv看电视直播软件 编辑:程序博客网 时间:2024/05/21 16:04

1.自写pigeon框架使用介绍

2. Springboot使用介绍:用来简化Spring应用的初始搭建以及开发过程

l  嵌入的Tomcat,无需部署WAR文件,使用SpringApplication引导项目启动,run()方法创建应用上下文,同时扫描当前应用类路径上的依赖,springApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下,你只需委托给SpringApplication.run这个静态方法

SpringApplication.run(MySpringConfiguration.class,args);

l  一键生成Maven项目,简化Maven配置

l  支持更多注解,SpringBoot提倡基于Java的配置

@Configuration:等同于spring的XML配置文件,指出该类是 Bean 配置的信息源,相当于XML中的<beans></beans>,一般加在主类上

@EnableAutoConfiguration: Spring应用上下文的自动化配置,尝试去猜测和配置你需要的bean。这些被自动化配置的类通常在classpath路径下,或者是你自己定义的bean,一般加在主类上

@ComponentScan:组件扫描,可自动发现和装配一些Bean,使用@ComponentScan注解搜索beans,并结合@Autowired构造器注入, 添加@ComponentScan注解而不需要任何参数。所有应用程序组件(@Component, @Service, @Repository, @Controller等)将被自动注册为Spring Beans。相当于<context:component-scan>,

@SpringBootApplication:等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

@RestController:是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器

 


 

3.Fork/Join:Java7提供的一个用于并行执行任务的框架,主要作用是分割任务和汇总结果

l  Fork/Join框架提供了以下两个子类:

RecursiveAction:用于没有返回结果的任务。

RecursiveTask :用于有返回结果的任务。

l  任务类必须继承RecursiveTask或者RecursiveAction

public classCountTask extends RecursiveTask<T>{

@Override

Protected T computer(){

//具体业务执行逻辑

}

}

l  分割任务逻辑

for(MarketingMessageDO mmDo : lists) {

       MarketingTask mTask = newMarketingTask(mmDo.getChannel());

       mTask.fork();

       mTasks.add(mTask);

}

l  合并任务结果

for (MarketingTaskmarketingTask : mTasks) {

              sum+=marketingTask.join();

}

l  ForkJoinTask需要通过ForkJoinPool来执行

ForkJoinPoolforkJoinPool = new ForkJoinPool();

MarketingTasktask = new MarketingTask(1, 4);

Future<Integer>res = forkJoinPool.submit(task);

实现原理:

l  ForkJoinTask的fork方法实现原理:

    publicfinal ForkJoinTask<V> fork() {

        Thread t;

        if ((t = Thread.currentThread())instanceof ForkJoinWorkerThread)

           ((ForkJoinWorkerThread)t).workQueue.push(this);

        else

           ForkJoinPool.common.externalPush(this);

        return this;

}

当调用ForkJoinTask的fork方法时,程序会调用ForkJoinWorkerThread的push方法加入ForkJoinPool中workqueue里,再调用ForkJoinPool的signalWork()方法唤醒或创建一个工作线程来执行任务

l  ForkJoinTask的join方法实现原理

private intdoJoin() {

int s; Threadt; ForkJoinWorkerThread wt; ForkJoinPool.WorkQueue w;

return (s =status) < 0 ? s :

 ((t = Thread.currentThread()) instanceofForkJoinWorkerThread) ?

 (w = (wt = (ForkJoinWorkerThread)t).workQueue).

            tryUnpush(this) && (s =doExec()) < 0 ? s :

            wt.pool.awaitJoin(w, this, 0L) :

            externalAwaitDone();

 }

tryUnpush:从workqueue获取该任务

doExec:执行任务

awaitJoin:当前work线程阻塞等待当前任务执行完成

externalAwaitDone:外部线程阻塞等待任务执行完成

ForkJoinTask继承Future类来处理线程返回结果,Join方法的主要作用是阻塞当前线程并获取结果

l  ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责存放程序提交给ForkJoinPool的任务,而ForkJoinWorkerThread数组负责执行这些任务

原创粉丝点击