spring的ioc https://javadoop.com/post/spring-ioc
spring的bean钩子 https://www.jianshu.com/p/a90a3e617ba6
java的hashset https://blog.csdn.net/guoweimelon/article/details/50804799?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight
java的lock补充 https://www.cnblogs.com/dolphin0520/p/3923167.html
常用注解 https://blog.csdn.net/yamadeee/article/details/80381092
c执行 编译汇编 https://www.cnblogs.com/mhq-martin/p/11898245.html
rxjs图解 https://rxmarbles.com/
章宜春 nginx http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
java的通配符 https://blog.csdn.net/a_finder/article/details/102766113
rocketmq :起步,基础概念https://blog.csdn.net/weixin_40533111/article/details/84451096
作为顺序消费https://blog.csdn.net/hosaos/article/details/90675978
常用命令 https://www.cnblogs.com/gmq-sh/p/6232633.html
extend的作为生产者,super作为消费者
java的copyonwritearraylist https://www.jianshu.com/p/9b6a4d0b94ac
java多线程 http://concurrent.redspider.group/article/01/2.html
java的原子操作和双重锁检查
Object.wait https://blog.csdn.net/hemeinvyiqiluoben/article/details/82990817
Thread.join原理(wait-notify)简洁版 https://blog.csdn.net/u010983881/article/details/80257703
Thread.join的方法实习调用wait 如果省缺this,默认是当前实例而操作当前线程实例所在的线程(即调用线程,所以说join会把调用线程挂起。
当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。
解释:
例子:
package pair1;// previousThread.join时,让路给引用实例,wait的是currentThreadpublic class ThreadJoinTest extends Thread{int i;Thread previousThread; //上一个线程public ThreadJoinTest(Thread previousThread,int i){this.previousThread=previousThread;this.i=i;}@Overridepublic void run() {try {//调用上一个线程的join方法,大家可以自己演示的时候可以把这行代码注释掉System.out.println("join====before print"+i+previousThread.getName());previousThread.join();// System.out.println("join====after print"+i);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("num:"+i);}public static void main(String[] args) {Thread previousThread=Thread.currentThread();for(int i=0;i<10;i++){ThreadJoinTest joinDemo=new ThreadJoinTest(previousThread,i);System.out.println("start=====before print"+i);joinDemo.start();System.out.println("start=====after print"+i);previousThread=joinDemo;}}}
futuretask https://blog.csdn.net/qq_39654841/article/details/90631
//FutureTask 自定义Callable这里调用submit方法是没有返回值的。这里实际上是调用的submit(Runnable task)方法,而Callable的Demo,调用的是submit(Callable<T> task)方法。然后,这里是使用FutureTask直接取get取值,而上面的Demo是通过submit方法返回的Future去取值。class Task implements Callable<Integer>{@Overridepublic Integer call() throws Exception {// 模拟计算需要一秒Thread.sleep(1000);return 2;}public static void main(String args[]) throws Exception {// 使用ExecutorService executor = Executors.newCachedThreadPool();FutureTask<Integer> futureTask = new FutureTask<>(new Task());//这边只执行,使用原对象来getexecutor.submit(futureTask);System.out.println(futureTask.get());}}//Callable 自定义Callable,与上面一样class Task implements Callable<Integer>{@Overridepublic Integer call() throws Exception {// 模拟计算需要一秒Thread.sleep(1000);return 2;}public static void main(String args[]) throws Exception {// 使用ExecutorService executor = Executors.newCachedThreadPool();Task task = new Task();Future<Integer> result = executor.submit(task);// 注意调用get方法会阻塞当前线程,直到得到结果。// 所以实际编码中建议使用可以设置超时时间的重载get方法。System.out.println(result.get());}}
守护线程 https://www.cnblogs.com/quanxiaoha/p/10731361.html 守护进程是为了让jvm结束(main线程结束后),线程不要在后台继续执行便于被GC回收。
aspectj的execute
- modifers-pattern:方法的修饰符,支持通配符,可以省略,一般省略
- return-type-pattern ;方法返回值类型,必写可以使用通配符*,表示所有返回值类型
- declaring-type-pattern:类路径。可以省略表示所有类。可以使用通配符。 com.example.dao.User* //表示 匹配com.example.dao包下,所有以User开头的类,其中.代表包下所有子类,..代表包下所有(子孙类)
- method-name: 方法名,必写。可以使用通配符*,表示所有方法。
- param-pattern:方法参数,必写。
- 使用通配符* ,表示任意一个参数类型。
- 使用通配符==…==,表示零个或多个任意类型的参数。
(*,String),匹配两个参数的方法。表示第一个参数类型任意,第二个必须为String类型。
(..),表示任意(个数、类型)参数
- throws-pattern:方法抛出异常,可以省略
forkjoin详细 https://www.jianshu.com/p/4e41727f8053 https://www.jianshu.com/p/f777abb7b251
best https://www.cnblogs.com/cjsblog/p/9078341.html
package pair1;import java.util.Objects;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.RecursiveTask;/**可以来学习递归的分治* 计算1+2+3+...+n的值* 使用同步执行的方式** @author yuhao.wang3* @since 2019/6/25 17:07*/public class ForkJoinCountTask extends RecursiveTask<Long> {/*** 阀值*/private int threshold = 10;/*** 任务的开始值*/private long start;/*** 任务的结束值*/private long end;public ForkJoinCountTask(long start, long end) {this.start = start;this.end = end;}@Overrideprotected Long compute() {if (end - start <= threshold) {long count = 0;for (int i = 0; i <= end - start; i++) {count = count + start + i;}System.out.println(String.format("arg: %s, count: %d","count", count));return count;} else {// 如果任务大于阈值,就分裂成三个子任务计算long slip = (end - start) / 3;ForkJoinCountTask oneTask = new ForkJoinCountTask(start, start + slip);ForkJoinCountTask twoTask = new ForkJoinCountTask(start + slip + 1, start + slip * 2);ForkJoinCountTask threeTask = new ForkJoinCountTask(start + slip * 2 + 1, end);// 提交子任务到框架去执行invokeAll(oneTask, twoTask, threeTask);// 等待子任务执行完,得到其结果,并合并子任务return oneTask.join() + twoTask.join() + threeTask.join();}}public static void main(String[] args) {long start = System.currentTimeMillis();ForkJoinPool pool = new ForkJoinPool();// 生成一个计算任务,负责计算1+2+3+nForkJoinCountTask countTask = new ForkJoinCountTask(1, 1000000);// 执行一个任务(同步执行,任务会阻塞在这里直到任务执行完成)pool.invoke(countTask);// 异常检查if (countTask.isCompletedAbnormally()) {Throwable throwable = countTask.getException();if (Objects.nonNull(throwable)) {System.out.println(throwable.getMessage());}}// join方法是一个阻塞方法,会等待任务执行完成System.out.println("计算为:" + countTask.join() + ", 耗时:" + (System.currentTimeMillis() - start) + "毫秒");}}
