线程池处理任务流程,java线程池释放线程
什么是线程池?
线程池是一种可以重用线程的技术。
不使用线程池的问题:
如果每次用户发起请求,都在后台创建一个新线程来处理,下一次新任务来的时候又创建一个新线程,创建新线程的成本非常高,会严重影响系统的性能。
线程池常见面试问题:
1.什么时候会创建临时线程?
当一个新任务提交后,发现核心线程忙,任务队列满,可以创建临时线程。只有这样,才会创建临时线程。
2.什么时候开始拒绝任务?
核心线程和临时线程都很忙,任务队列已满。新任务来了,任务拒绝就开始了。
1.线程池处理可运行的任务。
导入Java . util . concurrent . *;类多线程_5线程池处理可运行任务{ Public static void main(string[]args){//线程池处理可运行任务//创建线程池对象/*公共线程池执行器(int corepoolsize,//核心线程数int maximumPoolSize,//线程池支持的最大线程数long keepAliveTime,//临时线程的最大生存期时间单位,//指定生存期的单位(秒、点等。)BlockingQueueRunnable工作队列,//指定任务队列ThreadFactory threadFactory,//指定使用哪个线程工厂创建线程rejectedExecutionHandler处理程序)//指定当线程繁忙且任务已满时,如果有新任务来了怎么办*/executorservicepool=newthreadpooleexecutor(3,5,6,timeunit.seconds,newArrayBlockingQueue (5),executors.defaultthreadfactory(),newthreadpooleexecutor . abort policy());//为任务线程池处理Runnable r=new my exe();//三个核心线程pool . execute(r);池.执行(r);池.执行(r);//五个任务队列(不创建临时线程的时候会发现只有三个线程,也就是核心线程的数量)pool . execute(r);池.执行(r);池.执行(r);池.执行(r);池.执行(r);//创建一个临时线程(五个线程,即最大线程数)pool . execute(r);池.执行(r);//如果没有创建,则触发拒绝策略。//pool . execute(r);//关闭线程池(开发中一般不用)//pool . shut down now();//立即关闭,即使任务没有完成。你会丢掉任务的!//pool . shut down();//将等待所有任务执行完毕后关闭(推荐)}}类MyExe实现Runable { public void run(){ for(int I=1;I=6;I){ system . out . println(thread . current thread()。正在执行的“getname()”:“I”次);}//由于当前的case任务过于简单,我们需要创建一个临时队列来保持三个核心线程忙,五个任务队列满,所以让线程休眠来增加任务时间试试{ system . out . println(thread . current thread()。getname()任务绑定到线程,线程进入睡眠);thread . sleep(1000000);} catch(Exception e){ e . printstacktrace();} }}
style="text-align:center">
2、线程池处理Callable任务
import java.util.concurrent.*;public class 多线程_5线程池处理Callable任务 { public static void main(String[] args) throws Exception { //线程池处理Callable任务 //创建线程池对象 /* public ThreadPoolExecutor(int corePoolSize,//核心线程数量 int maximumPoolSize,//线程池可支持的最大线程数量 long keepAliveTime,//临时线程的最大存活时间 TimeUnit unit,//指定存活时间的单位(秒,分等) BlockingQueue<Runnable> workQueue,//指定任务队列 ThreadFactory threadFactory,//指定用哪个线程工厂创建线程 RejectedExecutionHandler handler)//指定线程忙,任务满了的时候,新任务来了怎么办 */ ExecutorService pool=new ThreadPoolExecutor(3,5, 6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy()); //给任务线程池处理// Callable c=new MyCallable2(100);// pool.submit(c); Future<String> f1=pool.submit(new MyCallable2(100)); Future<String> f2=pool.submit(new MyCallable2(200)); Future<String> f3=pool.submit(new MyCallable2(300)); Future<String> f4=pool.submit(new MyCallable2(400)); Future<String> f5=pool.submit(new MyCallable2(500));// String str=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()); }}class MyCallable2 implements Callable<String> { // v(泛型) private int n; public MyCallable2(int n) { this.n = n; } //重写call方法 //案例:加法 public String call() throws Exception { int sum = 0; for (int i = 1; i <=n; i++) { sum += i; } return Thread.currentThread().getName()+"执行 1-"+n+"的和,结果为:" + sum; }}
到此这篇关于Java详解使用线程池处理任务方法的文章就介绍到这了,更多相关Java线程池内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。