Java详解使用线程池处理任务方法_第1页
Java详解使用线程池处理任务方法_第2页
Java详解使用线程池处理任务方法_第3页
Java详解使用线程池处理任务方法_第4页
Java详解使用线程池处理任务方法_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java详解使用线程池处理任务方法不使用线程池的问题:

如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。

线程池常见面试题:

1、临时线程什么时候创建?

新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。

2、什么时候会开始拒绝任务?

核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝。

1、线程池处理Runnable任务

importjava.util.concurrent.*;

publicclass多线程_5线程池处理Runnable任务{

publicstaticvoidmain(String[]args){

//线程池处理Runnable任务

//创建线程池对象

publicThreadPoolExecutor(intcorePoolSize,//核心线程数量

intmaximumPoolSize,//线程池可支持的最大线程数量

longkeepAliveTime,//临时线程的最大存活时间

TimeUnitunit,//指定存活时间的单位(秒,分等)

BlockingQueueRunnableworkQueue,//指定任务队列

ThreadFactorythreadFactory,//指定用哪个线程工厂创建线程

RejectedExecutionHandlerhandler)//指定线程忙,任务满了的时候,新任务来了怎么办

ExecutorServicepool=newThreadPoolExecutor(3,5,

6,TimeUnit.SECONDS,newArrayBlockingQueue(5),

Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());

//给任务线程池处理

Runnabler=newMyExe();

//三个核心线程

pool.execute(r);

pool.execute(r);

pool.execute(r);

//五个任务队列(不创建临时线程时,会发现只有三个线程,即核心线程量)

pool.execute(r);

pool.execute(r);

pool.execute(r);

pool.execute(r);

pool.execute(r);

//创建临时线程(五个线程,即最大线程量)

pool.execute(r);

pool.execute(r);

//不创建,拒绝策略被触发

//pool.execute(r);

//关闭线程池(开发中一般不会使用)

//pool.shutdownNow();//立即关闭,即使任务没有执行完毕。会丢失任务的!

//pool.shutdown();//会等待任务全部执行完毕后再关闭(建议使用)

classMyExeimplementsRunnable{

publicvoidrun(){

for(inti=1;ii++){

System.out.println(Thread.currentThread().getName()+"正在执行:"+i+"次");

//因为当前案例任务太简单,我们需要创建临时队列需要让三个核心线程忙,五个任务队列排满,所以让线程休眠以增加任务时间

try{

System.out.println(Thread.currentThread().getName()+"任务与线程绑定,线程进入了休眠");

Thread.sleep(1000000);

}catch(Exceptione){

e.printStackTrace();

}

2、线程池处理Callable任务

importjava.util.concurrent.*;

publicclass多线程_5线程池处理Callable任务{

publicstaticvoidmain(String[]args)throwsException{

//线程池处理Callable任务

//创建线程池对象

publicThreadPoolExecutor(intcorePoolSize,//核心线程数量

intmaximumPoolSize,//线程池可支持的最大线程数量

longkeepAliveTime,//临时线程的最大存活时间

TimeUnitunit,//指定存活时间的单位(秒,分等)

BlockingQueueRunnableworkQueue,//指定任务队列

ThreadFactorythreadFactory,//指定用哪个线程工厂创建线程

RejectedExecutionHandlerhandler)//指定线程忙,任务满了的时候,新任务来了怎么办

ExecutorServicepool=newThreadPoolExecutor(3,5,

6,TimeUnit.SECONDS,newArrayBlockingQueue(5),

Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());

//给任务线程池处理

//Callablec=newMyCallable2(100);

//pool.submit(c);

FutureStringf1=pool.submit(newMyCallable2(100));

FutureStringf2=pool.submit(newMyCallable2(200));

FutureStringf3=pool.submit(newMyCallable2(300));

FutureStringf4=pool.submit(newMyCallable2(400));

FutureStringf5=pool.submit(newMyCallable2(500));

//Stringstr=f1.get();

//System.out.println(str);

System.out.println(f1.get());

System.out.println(f2.get());

System.out.println(f3.get());

System.out.println(f4.get());

System.out.println(f5.get());

classMyCallable2implementsCallableString{

//v(泛型)

privateintn;

publicMyCallable2(intn){

this.n=n;

//重写call方法

//案例:加法

pub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论