重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
线程池就是一个可以复用线程的技术。在没有线程池时,用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来后又继续创建新线程。而创建新线程的开销是很大的,会严重影响系统性能。
2. 创建线程池
什么时候创建新线程: 新任务提交时核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。
什么时候开始拒绝任务: 核心线程和临时线程都在忙,任务队列也满了,新任务进来的时候才会开始任务拒绝。
public class ThreadPoolDemo {public static void main(String[] args) {//1、创建线程池对象
ExecutorService pool = new ThreadPoolExecutor(3, 5, 6,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//AbortPolicy():丢弃任务并抛出RejectedException异常,是默认策略。
//DiscardPolicy():丢弃任务但是不抛出i长,不推荐的做法。
//DiscardOldestPolicy():抛弃队列中等待最久的任务,然后把当前任务加入队列中。
//CallerRunsPolicy():由主线程负责调用任务的run()方法从而跳过线程池直接执行。
//2、创建任务
Runnable target = new MyRunnable();
//3、给线程池增加任务
pool.execute(target);
pool.execute(target);
pool.execute(target);
//占满五个队列
pool.execute(target);
pool.execute(target);
pool.execute(target);
pool.execute(target);
pool.execute(target);
//开始创建临时线程
pool.execute(target);
pool.execute(target);
//超过等待(大线程数+大等待队列数),开始拒绝
//pool.execute(target);
//关闭线程池(开发中一般不使用)
pool.shutdown();//等待全部任务执行完毕之后再关闭
pool.shutdownNow();//立即关闭,即使任务没有完成,丢失任务!
}
}
2.1.2 使用Callable提交任务//使用线程池对象的submit()方法提交Callable任务,并用FutureTask的父类接收对象
Futuref1 = pool.submit(new MyCallable(100));
//输出任务执行后的返回结果
System.out.println(f1.get());
2.2 Executors创建线程池大型并发系统环境中使用Executors如果不注意可能会出现系统风险。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧