多线程并发情况下需要考虑线程安全问题,一般用锁来确保核心代码只有单个线程能运行。长用的有synchronized、ReentrantLock、ReadWriteLock,这些内部实现都依赖于AbstractQueuedSynchronizer类。
大致流程
- 线程尝试获取锁,如果获取到,线程状态保持RUNNING,程序按照业务流程走下去
- 如果获取失败,说明已经有其他线程获取锁了,将此线程加入到等待队列中,并将该线程挂起
- 线程尝试释放锁,并将等待队列中的线程唤醒‘
多线程并发情况下需要考虑线程安全问题,一般用锁来确保核心代码只有单个线程能运行。长用的有synchronized、ReentrantLock、ReadWriteLock,这些内部实现都依赖于AbstractQueuedSynchronizer类。
开门见山
public class ScheduledThreadPoolExecutor
extends ThreadPoolExecutor
implements ScheduledExecutorService {
public ScheduledThreadPoolExecutor(int corePoolSize) {
//super调用父类的构造方法 即调用ThreadPoolExecutor的构造方法
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
}
在https://busnoseat.github.io/2016/12/15/并发模式-多线程/ 这篇文章里,分析了线程池ThreadPoolExecutor的工作模式。这篇文章稍微分析下Executors.
Executors是ThreadPoolExecutor的执行器,可以使用java定义好的几种线程池,其实这几种线程池共用了一个构造方法,只是入参不一样就有了不一样的线程池。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
一直很想写一篇关于多线程的文章,于是搜了很多文章,自己琢磨了许久才敢下笔 ,那么开始吧。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
<code> $ vim filename </code>
<code> $ /关键字 </code>
(查询出来后 按键n n表示next)
<code> $ grep '关键字' filename| grep '关键字' </code>
问题: 项目日志一般用slf4j,logback等自定义日志文件,或者存到mongdb里。这样就没必要使用tomcat的打印的日志,尤其是catalina.out,虽然每天备份但是不清空自身会导致内存吃紧。
#第一篇文章 当然是怎么搭建博客的