JAVA多线程-未完结
一.线程组件
1.线程池
1.1.线程池类型:newSingleThreadExecutor、newFixedThreadPool 等等
1.2. 线程池参数:ThreadPoolExecutor(int corePoolSize, //核心线程的数量
int maximumPoolSize, //最大线程数量
long keepAliveTime, //超出核心线程数量以外的线程空余存活时间
TimeUnit unit, //存活时间的单位
BlockingQueue<Runnable> workQueue, //保存待执行任务的队列
ThreadFactory threadFactory, //创建新线程使用的工厂
RejectedExecutionHandler handler) // 当任务无法执行时的处理器
1.3.线程池执行原理以及关闭原理:
1.4.线程池终止(具体代码看上述截图):
shutdown:线程池将变shutdown状态,此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务。
shutdownNow:线程池变stop状态,此时不接收新任务,不再处理在阻塞队列中等待的任务,还会尝试中断正在处理中的工作线程。
2.阻塞队列(TODO)
二.线程方法
包括join(long millis)、wait(long millis)、future、callable等原理。
1. join原理:在ThreadA中调用ThreadB.join();
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0); //该方法在线程ThreadA中调用,因此阻塞线程ThreadA;ThreadB在执行完毕后会notifyAll(),唤起ThreadA;
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
3. ReentrantLock、semaphore原理
3.AQS详解。共享模式/独占模式;CLH(TODO)
小结:乐观锁,在ReentrantLock和Sempahore应用的cas;
公平锁与非公平锁,如lock.lock()是否立即cas操作;是则为非公平锁;
偏向锁:如ReentrantLock首先cas操作,cas失败则加入AQS的CLH队列,否则在进度共享代码块内,若代码块内有Condition,则会在Condition.await()处阻塞、此处为重量级锁;
可重入锁:ReentrantLock在compareAndSetState失败时,若当前线程是成员变量state的set成功的那个线程,则不再加入CLH以及selfInterrupt();
2. callbale原理: https://blog.****.net/u012664375/article/details/66967687
三.线程应用场景:生产者消费者、读写问题
1.参照 https://www.cnblogs.com/xkxf/p/7890686.html
四.线程锁机制:
乐观锁、悲观锁;
可重入锁、读写锁;
自旋锁;