SQL
join
- left join 、 right join 都是以join的主动方来显示完全,被join的一方如果没有on或者using匹配的会显示null,A left join B(B是被join的一方)
-
inner join 只会显示on或using匹配上的项,也就是两个取交集;full join会显示所有的项
-
一些例子
case when
-
语法
CASE WHEN condition THEN result [WHEN...THEN...] ELSE result END
以下两种用法等价:
CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END
CASE WHEN SCORE = 'A' THEN '优' WHEN SCORE = 'B' THEN '良' WHEN SCORE = 'C' THEN '中' ELSE '不及格' END
happens-before
- JMM对于程序员的承诺:如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
- JMM对编译器和处理器重排序的约束原则:两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序不非法。
- as-if-serial:单线程内程序的执行结果不会被改变;happens-before:保证正确同步的多线程程序的执行结果不被改变。
@Async
使用@Async可以方便地结合线程池进行多线程方法的使用
-
创建线程池
当在一个方法上标注了@Async注解之后,在被调用的时候主线程会主动使用多线程来调用此方法,但是当我们需要线程池来堆多线程进行管理的时候就需要使用到配置类线程池的Bean.@Configuration @EnableAsync public class AsyncConfig{ private final RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.AbortPolicy(); @Bean("produce-resource") public TaskExecutor produceResourceTaskExecutor() { //通过Runtime方法来获取当前服务器cpu内核,根据cpu内核来创建核心线程数和最大线程数 int threadCount = Runtime.getRuntime().availableProcessors(); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(6); executor.setMaxPoolSize(6); executor.setQueueCapacity(QUEUE_CAPACITY); executor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS); executor.setThreadNamePrefix(THREAD_NAME_PREFIX); //当出现被拒绝的线程如何进行处理 executor.setRejectedExecutionHandler(rejectedExecutionHandler); executor.setWaitForTasksToCompleteOnShutdown(true); executor.initialize(); return executor; } }
-
编写多线程方法
在使用多线程方法上标注@Async时表明调用的线程池@Async("produce-resource") public void doTaskThree() throws Exception { System.out.println("开始做任务三"); long start = System.currentTimeMillis(); Thread.sleep(10000); long end = System.currentTimeMillis(); System.out.println("完成任务三,耗时:" + (end - start) + "毫秒"); }
注意:标注@Async注解的方法和调用的方法一定不能在同一个类下,这样的话注解会失效