栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程池ThreadPoolExecutor的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程池ThreadPoolExecutor的使用

创建一个线程池(参数解读):

ThreadPoolExecutor executor = new ThreadPoolExecutor(
				5,
				
				10,
				
				200, 
				
				TimeUnit.MILLISECONDS, 
				
				new ArrayBlockingQueue(5),
				
				new ThreadPoolExecutor.CallerRunsPolicy()
				
				);

线程任务:打印当前任务被哪个线程执行

package concurrent;

class ThreadTask implements Runnable {
    String taskName;
    public ThreadTask(String taskName) {
        this.taskName = taskName;
    }
     
    public void run() {
        System.out.println(Thread.currentThread()+" 正在执行 "+taskName);
        try {
        	//随便睡一会,领导叫了再去干活!
        	Thread.sleep((long)(Math.random()*10000));
        } catch (InterruptedException e) {
        	System.out.println("任务"+taskName+"被异常终止");
        }
        System.out.println("任务"+taskName+"被正常执行完毕");
    }
}

线程池状态检测:每隔1000ms左右打印一次检测信息到控制台

package concurrent;

import java.util.concurrent.ThreadPoolExecutor;


class ThreadPoolCheck implements Runnable {
	ThreadPoolExecutor executor;
	public ThreadPoolCheck(ThreadPoolExecutor executor) {
		this.executor=executor;
	}
	private void showPoolInfo(ThreadPoolExecutor executor,int count){
		System.out.println("=========开始第"+count+"次检测===========");
		System.out.println("已经执行完成的任务数目:"+executor.getCompletedTaskCount());
		System.out.println("队列中等待执行的任务数目:"+executor.getQueue().size());
		System.out.println("线程池中核心线程数:"+executor.getCorePoolSize());
		System.out.println("线程池中活跃线程数目:"+executor.getActiveCount());
		System.out.println("线程池中允许的最大线程数目:"+executor.getMaximumPoolSize());
		System.out.println("=========完成第"+count+"次检测===========");
	}
	public void run() {
		int count=0;
		 while(true){
			count++;
			try {
				//睡一下,再继续工作吧!
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			showPoolInfo(executor,count);
			//线程池都死了,我也不独活了!
			if(executor.isTerminated()){
				break;
			}
		 }
	}
}

主线程:创建线程池、线程任务

package concurrent;

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


public class ThreadPoolEx {
	public static void main(String[] args) {
		ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,200,TimeUnit.MILLISECONDS,new ArrayBlockingQueue(5),new ThreadPoolExecutor.CallerRunsPolicy());//创建线程池
		new Thread(new ThreadPoolCheck(executor)).start();//先额外启动一个线程,检测线程池的状态
		executor.prestartAllCoreThreads();//提前启动线程池所有核心线程
		for(int i=0;i<20;i++) {
			//创建20个线程任务,至少任务15个肯定由线程池中的线程执行(最大线程数+任务队列中的任务数)
			//剩下的任务,由主线程(采取CallerRunsPolicy策略)执行
			ThreadTask threadTask = new ThreadTask("threadtask-"+i);
			executor.execute(threadTask);//执行线程任务
		}
		if (!executor.isShutdown()) {
			executor.shutdown();//关闭线程池
		}
	}
}

一次运行结果打印的信息如下:
可以看到有2个任务不是由线程池中的线程执行的,而是由主线程执行的,是因为我采取了CallerRunsPolicy策略。总共创建了20个任务,但线程池中的线程只执行了其中18个任务。

Thread[pool-1-thread-2,5,main] 正在执行 threadtask-1
Thread[pool-1-thread-7,5,main] 正在执行 threadtask-7
Thread[main,5,main] 正在执行 threadtask-15
Thread[pool-1-thread-6,5,main] 正在执行 threadtask-5
Thread[pool-1-thread-10,5,main] 正在执行 threadtask-14
Thread[pool-1-thread-8,5,main] 正在执行 threadtask-8
Thread[pool-1-thread-1,5,main] 正在执行 threadtask-0
Thread[pool-1-thread-5,5,main] 正在执行 threadtask-4
Thread[pool-1-thread-4,5,main] 正在执行 threadtask-3
Thread[pool-1-thread-3,5,main] 正在执行 threadtask-2
Thread[pool-1-thread-9,5,main] 正在执行 threadtask-10
任务threadtask-3被正常执行完毕
Thread[pool-1-thread-4,5,main] 正在执行 threadtask-6
=========开始第1次检测===========
已经执行完成的任务数目:1
队列中等待执行的任务数目:4
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第1次检测===========
任务threadtask-6被正常执行完毕
Thread[pool-1-thread-4,5,main] 正在执行 threadtask-9
任务threadtask-15被正常执行完毕
Thread[main,5,main] 正在执行 threadtask-18
任务threadtask-7被正常执行完毕
Thread[pool-1-thread-7,5,main] 正在执行 threadtask-11
=========开始第2次检测===========
已经执行完成的任务数目:3
队列中等待执行的任务数目:4
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第2次检测===========
任务threadtask-4被正常执行完毕
Thread[pool-1-thread-5,5,main] 正在执行 threadtask-12
任务threadtask-0被正常执行完毕
Thread[pool-1-thread-1,5,main] 正在执行 threadtask-13
任务threadtask-8被正常执行完毕
Thread[pool-1-thread-8,5,main] 正在执行 threadtask-16
=========开始第3次检测===========
已经执行完成的任务数目:6
队列中等待执行的任务数目:1
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第3次检测===========
=========开始第4次检测===========
已经执行完成的任务数目:6
队列中等待执行的任务数目:1
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第4次检测===========
任务threadtask-18被正常执行完毕
=========开始第5次检测===========
已经执行完成的任务数目:6
队列中等待执行的任务数目:2
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第5次检测===========
=========开始第6次检测===========
已经执行完成的任务数目:6
队列中等待执行的任务数目:2
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第6次检测===========
任务threadtask-11被正常执行完毕
Thread[pool-1-thread-7,5,main] 正在执行 threadtask-17
任务threadtask-1被正常执行完毕
Thread[pool-1-thread-2,5,main] 正在执行 threadtask-19
=========开始第7次检测===========
已经执行完成的任务数目:8
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:10
线程池中允许的最大线程数目:10
=========完成第7次检测===========
任务threadtask-2被正常执行完毕
任务threadtask-9被正常执行完毕
任务threadtask-10被正常执行完毕
=========开始第8次检测===========
已经执行完成的任务数目:11
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:7
线程池中允许的最大线程数目:10
=========完成第8次检测===========
任务threadtask-13被正常执行完毕
任务threadtask-14被正常执行完毕
任务threadtask-16被正常执行完毕
=========开始第9次检测===========
已经执行完成的任务数目:14
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:4
线程池中允许的最大线程数目:10
=========完成第9次检测===========
任务threadtask-5被正常执行完毕
=========开始第10次检测===========
已经执行完成的任务数目:15
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:3
线程池中允许的最大线程数目:10
=========完成第10次检测===========
=========开始第11次检测===========
已经执行完成的任务数目:15
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:3
线程池中允许的最大线程数目:10
=========完成第11次检测===========
=========开始第12次检测===========
已经执行完成的任务数目:15
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:3
线程池中允许的最大线程数目:10
=========完成第12次检测===========
任务threadtask-12被正常执行完毕
=========开始第13次检测===========
已经执行完成的任务数目:16
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:2
线程池中允许的最大线程数目:10
=========完成第13次检测===========
任务threadtask-19被正常执行完毕
=========开始第14次检测===========
已经执行完成的任务数目:17
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:1
线程池中允许的最大线程数目:10
=========完成第14次检测===========
任务threadtask-17被正常执行完毕
=========开始第15次检测===========
已经执行完成的任务数目:18
队列中等待执行的任务数目:0
线程池中核心线程数:5
线程池中活跃线程数目:0
线程池中允许的最大线程数目:10
=========完成第15次检测===========

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号