知优码

您现在的位置是:首页 > Java语言 > Java进阶

Java进阶

Executors多线程有界队列阻塞执行任务

2020-10-21Java进阶
Executors多线程有界队列阻塞执行任务
Executors创建的多线程默认使用无边界队列,如果有超出100个任务,则任务队列中保存100个,有一万个,保存一万个。有多少任务就立即添加入队列容易造成内存溢出。
下面使用了固定大小的队列,当添加的任务超过队列大小时,将阻塞添加任务的线程。达到控制等待执行的任务总数的目的。
//多线程任务处理引擎
public class ExecutorEngine {
	
		//启动的线程数量
		public static int Thread_Count=5;
		
		//任务队列
		private static BlockingQueue<Runnable> linkedBlockingQueue = new LinkedBlockingQueue<Runnable>(Thread_Count*2);
		
		//线程池
		private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Thread_Count,
				Thread_Count, 0, TimeUnit.SECONDS, linkedBlockingQueue,new RejectedExecutionHandler() {
					//拒绝策略
					@Override
					public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
						try {
							System.err.println("队列已满,阻塞线程 "+Thread.currentThread().getName());
							executor.getQueue().put(r);//当拒绝的时候,阻塞插入线程
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						
					}
				});
		
		/**
		 * 根据队列大小,阻塞式添加任务。当超出队列容量的时候,阻塞插入线程。
		 * @param task
		 */
		public static void execute(Runnable task) {
			threadPoolExecutor.execute(task);
		}

}

通过调用ExecutorEngine.execute()方法执行任务,而不用管任务有多少个,因为超出队列大小就会阻塞添加任务的线程。