java线程,设置队列的大小实现队列阻塞
public class QueueThreads {private static int nThreads = 4;//Runtime.getRuntime().availableProcessors() * 2 + 1;private static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(4);//队列值大小设置为4private static ExecutorService executors = new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, queue, new ThreadFactory() {private final String threadNamePrefix = "si_query_task_";private final AtomicInteger count = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(Thread.currentThread().getThreadGroup(), r, threadNamePrefix + count.getAndIncrement());//t.setDaemon(true);return t;}});public static void main(String[] args) {for (int i = 0; i < 10; i++) {try {executors.execute(new Thread(new ThreadPoolTest(), "TestThread".concat("" + i)));int threadSize = queue.size();System.out.println("线程队列大小为-->" + threadSize);} catch(RejectedExecutionException e){System.out.println("阻塞异常");}catch (Exception e) {System.out.println("异常");}}executors.shutdown();}public void run() {synchronized (this) {try {System.out.println("线程名称:" + Thread.currentThread().getName());Thread.sleep(3000); //休眠是为了让该线程不至于执行完毕后从线程池里释放} catch (InterruptedException e) {//e.printStackTrace(); }}}}
本测试程序的队列设置为4,线程池的大小为4,循环开启10个任务执行结果:
分析:有8个任务执行成功了,线程处理完成立马会处理新的任务,但是出现了两个阻塞异常,原因是这两个任务来不及创建就被阻塞了,阻塞的结果就是丢弃。