有一栋100层高楼,从某一层开始扔下的玻璃球刚好摔坏,现有两个玻璃球,试用最简便的方法确定这个恰好摔坏玻璃球的那层.

  • 二分法
    第一颗玻璃球: 从50层开始尝试, 75 -> 87 -> 93 -> 96 -> 98 -> 99 -> 100
    第二颗: 若在50层碎了,需要从第一层开始一层一层的尝试

  • 粗调,细调
    第一颗玻璃球: 从10层开始尝试, 20 , 30 ,40, 50, 60, 70, 80, 90.
    第二颗: 第一层开始一层一层的尝试

阅读更多

ThreadPoolTaskExecutor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.concurrent.ThreadPoolExecutor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
public class ThreadPool {
public static final int DEFAULT_THREADS_NUMS = 2 * Runtime.getRuntime().availableProcessors();
@Bean("taskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();

int maxPoolSize = 2 * DEFAULT_THREADS_NUMS;
threadPoolTaskExecutor.setCorePoolSize(DEFAULT_THREADS_NUMS);
threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
threadPoolTaskExecutor.setQueueCapacity(maxPoolSize);
threadPoolTaskExecutor.setKeepAliveSeconds(60);
threadPoolTaskExecutor.setThreadNamePrefix("Async-Thread-");
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

return threadPoolTaskExecutor;
}
}

参考文章

CompletableFuture基本用法

对比

  • Future:我们的目的都是获取异步任务的结果,但是对于Future来说,只能通过get方法或者死循环判断isDone来获取。异常情况就更是难办。
  • CompletableFuture:只要我们设置好回调函数即可实现:
  1. 只要任务完成,即执行我们设置的函数(不用再去考虑什么时候任务完成)
  2. 如果发生异常,同样会执行我们处理异常的函数,甚至连默认返回值都有(异常情况处理更加省力)
  3. 如果有复杂任务,比如依赖问题,组合问题等,同样可以写好处理函数来处理(能应付复杂任务的处理)
阅读更多

有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

  • 示例 1:
    1
    2
    3
    4
    输入:nums = [-4,-1,0,3,10]
    输出:[0,1,9,16,100]
    解释:平方后,数组变为 [16,1,0,9,100]
    排序后,数组变为 [0,1,9,16,100]
  • 示例 2:
    1
    2
    输入:nums = [-7,-3,2,3,11]
    输出:[4,9,9,49,121]
阅读更多

二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

阅读更多

spring中的@PostConstruct注解的用法

@PostConstruct是java5的时候引入的注解,指的是在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。

阅读更多