前言:
在项目开发中发现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());
}
}