困惑已久的问题,ThreadPoolExecutor线程池三种队列,通过Demo我恍然大悟了

前言:

在项目开发中发现ThreadPoolExecutor线程池里面有三种队列:

ArrayBlockIngQueue、

LinkedBlockingDeque、

LinkedBlockingDeque、

通过demo展示提高自己对ThreadPoolExecutor创建线程时的工作原理,同时增加的自己的认知
 

LinkedBlockingDeque

demo1

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : LinkedBlockingDequeTest1
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 09:51
 */
@Slf4j
public class LinkedBlockingDequeTest1 {
    public static void main(String[] args) {
        LinkedBlockingDeque linkedBlockingDeque  =new LinkedBlockingDeque<Runnable>(2);
        log.info(String.valueOf(linkedBlockingDeque.size()));
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2,3,
                            5, TimeUnit.SECONDS,linkedBlockingDeque);
        poolExecutor.execute(new MyRunnable());
        poolExecutor.execute(new MyRunnable());
        poolExecutor.execute(new MyRunnable());
        poolExecutor.execute(new MyRunnable());
        poolExecutor.execute(new MyRunnable());
        poolExecutor.execute(new MyRunnable());

        log.info(poolExecutor.getPoolSize()+""+linkedBlockingDeque.size());
    }
}

运行结果:
在这里插入图片描述

LinkedBlockingDeque使用带参构造,max值可以参考,设定队列容量不够,有一个任务出现异常,放入了两个队列,执行了3个任务

demo2

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : LinkedBlockingDequeTest2
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 09:55
 */
@Slf4j
public class LinkedBlockingDequeTest2 {
    public static void main(String[] args) {
        LinkedBlockingDeque  linkedBlockingDeque = new LinkedBlockingDeque<Runnable>(2);
        log.info(String.valueOf(linkedBlockingDeque.size()));
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,5,
                TimeUnit.SECONDS,linkedBlockingDeque);
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        log.info(threadPoolExecutor.getPoolSize()+""+linkedBlockingDeque.size());
    }
}

运行结果:

在这里插入图片描述

linkedBlockingDeque使用了带参数构造,max值可以参考,但容量不够,有一个任务出现异常,放入队列两个任务,执行三个任务,有一个任务被拒绝。

demo3

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : LinkedBlockingDequeTest3
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 10:10
 */
@Slf4j
public class LinkedBlockingDequeTest3 {
    public static void main(String[] args) {
        LinkedBlockingDeque linkedBlockingDeque = new LinkedBlockingDeque<Runnable>();
        log.info(String.valueOf(linkedBlockingDeque.size()));

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,5,
                TimeUnit.SECONDS,linkedBlockingDeque);
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        log.info(threadPoolExecutor.getPoolSize()+""+linkedBlockingDeque.size());
    }
}

运行结果

在这里插入图片描述

此demo中,linkedBlockingDeque使用无参构造,max值可以忽略,使用new LinkedBlockingDeque()无参数构造,capacity值时Integer.MAX_VALUE

在这里插入图片描述

通过查看源代码LinkedBlockingDeque队列里面可以存储Integer.MAX_VALUE个数据,放入队列3个任务,执行2个任务

ArrayBlockingQueue

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : ArrayBlockingQueueTest1
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 10:23
 */
@Slf4j
public class ArrayBlockingQueueTest1 {
    public static void main(String[] args) {
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(2);
        log.info(String.valueOf(arrayBlockingQueue.size()));
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,5,
                TimeUnit.SECONDS,arrayBlockingQueue);
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        log.info(threadPoolExecutor.getPoolSize()+""+arrayBlockingQueue.size());
    }
}

运行结果:

在这里插入图片描述

demo中ArrayBlockingQueu使用带参数构造,其中max值被参考,demo中放入了两个队列,执行了三个任务

demo2

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : ArrayBlockingQueueTest2
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 10:33
 */
@Slf4j
public class ArrayBlockingQueueTest2 {
    public static void main(String[] args) {
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(2);
        log.info(String.valueOf(arrayBlockingQueue.size()));
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,5,
                TimeUnit.SECONDS,arrayBlockingQueue);
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        log.info(threadPoolExecutor.getPoolSize()+"" +arrayBlockingQueue.size());
    }
}

运行结果:

在这里插入图片描述

ArrayBlockingQueue使用带参数构造,max值被参考,但队列容量不够,有一个任务出现了异常,demo展示中队列放入两个任务,执行3个任务,有1个任务被拒绝

SynchronousQueue

demo1

package com.zcw.demo;

import com.sun.corba.se.impl.orbutil.concurrent.Sync;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : SynchronousQueueTest1
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 10:45
 */
@Slf4j
public class SynchronousQueueTest1 {
    public static void main(String[] args) {
        SynchronousQueue synchronousQueue = new SynchronousQueue<Runnable>();
        log.info(String.valueOf(synchronousQueue.size()));
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,5,
                TimeUnit.SECONDS,synchronousQueue);
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        log.info(threadPoolExecutor.getPoolSize()+""+synchronousQueue.size());
    }
}

运行结果:

在这里插入图片描述

直接执行了三个任务

demo2

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName : SynchronousQueueTest2
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 10:49
 */
@Slf4j
public class SynchronousQueueTest2 {
    public static void main(String[] args) {
        SynchronousQueue synchronousQueue = new SynchronousQueue<Runnable>();
        log.info(String.valueOf(synchronousQueue.size()));
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,5,
                TimeUnit.SECONDS,synchronousQueue);
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        threadPoolExecutor.execute(new MyRunnable());
        log.info(threadPoolExecutor.getPoolSize()+" "+synchronousQueue.size());
    }
}

运行结果:

在这里插入图片描述

demo中直接执行了三个任务,有一个任务被拒绝

package com.zcw.demo;

import lombok.extern.slf4j.Slf4j;

/**
 * @ClassName : MyRunnable
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-22 09:42
 */
@Slf4j
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        log.info("begin"+System.currentTimeMillis());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("end"+System.currentTimeMillis());
    }
}

通过Demo展示,希望我们熟悉ThreadPoolExecutor线程中使用不同队列时应该注意的事项。

原创文章 578 获赞 46 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_32370913/article/details/105674824