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.线程池执行原理以及关闭原理:

   JAVA多线程-未完结

JAVA多线程-未完结

JAVA多线程-未完结

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

 

四.线程锁机制:

乐观锁、悲观锁;

可重入锁、读写锁;

自旋锁;