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中的
@EnableAutoConfiguration: Spring应用上下文的自动化配置,尝试去猜测和配置你需要的bean。这些被自动化配置的类通常在classpath路径下,或者是你自己定义的bean,一般加在主类上
@ComponentScan:组件扫描,可自动发现和装配一些Bean, 使用@ComponentScan注解搜索beans,并结合@Autowired构造器注入, 添加@ComponentScan注解而不需要任何参数。所有应用程序组件(@Component, @Service, @Repository, @Controller等)将被自动注册为Spring Beans。相当于
@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
@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
实现原理:
l ForkJoinTask的fork方法实现原理:
publicfinal ForkJoinTask
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数组负责执行这些任务