java线程池创建及使用三部曲
java多线程技术是java编程中不可或缺的关键点,在各大互联网公司招聘线程技术是绕不过的坎,下面小编就带大家进行线程技术中线程池的创建及使用。话不多说直接上源码。
1、创建线程池,首先创建线程工厂。
public class UserThreadFactory implements ThreadFactory {
private final String factoryName;//定义线程工厂名称
private AtomicInteger index=new AtomicInteger(1);//随机正整数
/**
* 构造方法
* @param factoryName
*/
public UserThreadFactory(String factoryName) {
this.factoryName = factoryName;
}
/**
*重写newThread方法(从线程工厂中返回一个线程)
*/
@Override
public Thread newThread(Runnable r) {
String name=factoryName+index.getAndIncrement();//定义线程名称
Thread thread=new Thread(null,r,name,0);//创建线程
return thread;//返回线程
}
}
2、创建线程池拒绝策略,拒绝策略在线程池已满的时候触发执行下一步操作。
public class RejectedHandler implements RejectedExecutionHandler {
/**
* 拒绝策略
* @param r
* @param executor
*/
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("线程池已满:"+executor.toString());//具体操作由实际情况而定
}
}
3、核心步骤,创建线程池
public class UserThreadPool {
/**
* 线程池
* @param thread
* @param factory
*/
public static void threadRunning(Thread thread,UserThreadFactory factory){
//线程池缓存队列
BlockingQueue<Runnable> queue=new LinkedBlockingDeque<>(1024);
//拒绝策略
RejectedHandler handler = new RejectedHandler();
//创建线程池
/**
* corePoolSize:核心线程数量
* maximumPoolSize:线程池最大容量,超过这个容量线程将被阻塞
* keepAliveTime:当线程超过核心线程数时,空闲线程的回收等待时间
* TimeUtil.MILLISECONDS:keepAliveTime的时间单位,(5000),TimeUtil.SECONDS(5)底层都是有 sleep()实现
* workQueue:存放代处理任务的队列,该队列只接收Runnable接口
* ThreadFactory:线程工厂
* handler:当线程超过maximumPoolSize的时候触发拒绝策略
*/
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(512, 1024, 0L, TimeUnit.MILLISECONDS, queue, factory, handler);
//运行线程
threadPoolExecutor.execute(thread);
}
}
线程池创建完成,下面就是简单使用线程的方法。
public static void main(String[] args) {
System.out.println("我是main方法,主线程");
//创建线程工厂实例
UserThreadFactory factory=new UserThreadFactory("测试");
//从线程工厂创建线程
Runnable runnable=new Runnable() {
@Override
public void run() {
System.out.println("我是测试线程");
}
};
Thread thread=factory.newThread(runnable);
//使用线程池运行线程调用
UserThreadPool.threadRunning(thread,factory);
}
这就是线程池的创建及简单应用,后期小编会为大家分享java线程的同步机制,敬请请期待!