join线程等待
Vector<Thread> threads = new Vector<>();
for (int i = 0; i < 150 ; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() { });
threads.add(thread);
thread.setName("thread-"+i);
thread.start();
}
for (Thread thread : threads) {
try {
thread.join();
System.out.println("join"+thread.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
CountDownLatch
final CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
countDownLatch.countDown();
}
}).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
CyclicBarrier
final CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
cyclicBarrier.await();
}
}).start();
}
cyclicBarrier.await();
countDownLatch和cyclicBarrier有什么区别呢,他们的区别:countDownLatch只能使用一次,而CyclicBarrier方法可以使用reset()方法重置,所以CyclicBarrier方法可以能处理更为复杂的业务场景。
线程池
newCachedThreadPool | 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池的规模不存在限制。(数量不固定的线程池) |
---|---|
newFixedThreadPool | 创建一个固定长度线程池,可控制线程最大并发数,超出的线程会在队列中等待。(固定数量的线程池) |
newScheduledThreadPool | 创建一个固定长度线程池,支持定时及周期性任务执行。(定时线程池) |
newSingleThreadExecutor | 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。(单线程的线程池) |
Executors.newCachedThreadPool(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return null;
}
});
afterPropertiesSet
init-method 与afterPropertiesSet 都是在初始化bean的时候执行,执行顺序是afterPropertiesSet 先执行,init-method 后执行,从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。
Maven
<dependencies>中的jar直接加到项目中,管理的是依赖关系(如果有父pom,子pom,则子pom中只能被动接受父类的版本);<dependencyManagement>主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom不一定要继承父pom所定义的版本。