当前位置: 首页 > 后端技术 > PHP

高级面试题总结——线程池能这么玩吗?

时间:2023-03-29 16:48:50 PHP

前言我们在面试的时候经常会遇到关于多线程和线程池的问题。如何回答他们?今天我们就来了解一下Java中的线程池。什么是线程池?线程池是指在多线程应用程序的初始化过程中创建线程集合,然后在需要执行新任务时重新使用这些线程而不是创建新线程。线程池中的线程数通常完全取决于可用内存量和应用程序的需要。但是,可以增加可用线程的数量。线程池中的每个线程都会被分配一个任务,一旦任务完成,线程就会返回池中等待下一次分配。说白了就是线程的集合,为一个应用程序执行多个线程。为什么需要线程池?使用线程池,我目前解决了一个问题:使用线程池获取一个视频中的多个cover,节省了一些时间和资源。后台服务器不支持多图上传。使用线程池上传多张图片。减少上传时间的效果如下:上传前:9张图片至少需要3秒,用线程池优化后,9张图片需要1秒。由于以下原因,在多线程应用中必须使用线程:1.线程创建和销毁的数量减少,每个工作线程可以被复用以执行多个任务。2.线程池中的工作线程线程数可根据系统容量进行调整,防止服务器因内存消耗过多而被耗尽(每个线程大约需要1MB内存,开启的线程越多,消耗的越多)内存会变大,最后崩溃)。线程池提高了应用程序的响应时间。由于线程池中的线程已经准备好等待分配任务,应用程序可以直接使用它们而无需创建新线程。线程池为CLR节省了为每个短期任务创建完整线程的开销,并且可以在任务完成后回收资源。线程池根据系统当前运行的进程优化线程时间片。线程池允许我们启动多个任务而无需为每个线程设置属性。线程池允许我们传递一个对象引用,其中包含正在执行的任务的程序参数的状态信息。线程池可以用来解决限制处理特定请求的最大线程数的问题。安抚老法发的线程池的作用:线程池的作用是限制系统中执行线程的数量。可根据系统环境,自动或手动设置线程数,以达到最佳运行效果;线程太少会浪费系统资源,线程太多会造成系统拥塞,效率不高。使用线程池控制线程数,其他线程排队等待。任务执行完毕后,从队列中取出最前面的任务开始执行。如果队列中没有等待进程,则线程池中的这个资源正在等待。当有新的任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行;否则进入等待队列。单线程的缺点举个例子newThread(newRunnable(){@Overridepublicvoidrun(){paPaPaYourGridFriend();}}).start();重要的事情说三遍!!!如果你还在使用newThread来执行一个异步任务,那么你就Out了!如果你还在使用newThread来执行一个异步任务,那么你就Out了!如果你还在使用newThread来执行一个异步任务,那么你就Out了!缺点如下:a.newThread每次创建一个新对象,性能很差。b.线程缺乏统一管理,可能会无限创建线程,相互竞争,可能会占用过多的系统资源,导致crash或oom。C。缺少定时执行、周期执行、线程中断等更多功能。Java线程池1、newSingleThreadExecutor创建一个单线程线程池。这个线程池只有一个线程在工作,相当于用一个线程串行执行所有任务。如果唯一的线程异常结束,一个新的线程将取代它。这个线程池保证所有任务的执行顺序按照任务提交的顺序执行。2.newFixedThreadPool创建一个固定大小的线程池。每次提交任务时都会创建一个线程,直到线程达到线程池的最大大小。一旦线程池的大小达到最大值,它将保持不变。如果一个线程因为异常执行而结束,线程池会补充一个新的线程。3.newCachedThreadPool创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需的线程数,一些空闲线程(60秒内没有执行任务)将被回收。当任务数量增加时,线程池可以智能地添加新的线程来处理任务。这个线程池不限制线程池的大小,线程池的大小完全取决于操作系统(或JVM)可以创建的最大线程大小。4.newScheduledThreadPool创建一个无限大小的线程池。这个线程池支持定时和周期性的执行任务。newSingleThreadExecutorprivatevoidTextnewSingleThreadExecutor(){ExecutorServicepool=Executors.newSingleThreadExecutor();MyTask1task1=newMyTask1();MyTask2task2=newMyTask2();MyTask3task3=newMyTask3();//pool.execute(task1);//pool.execute(task2);//pool.execute(task3);新线程(任务1).开始();新线程(任务2).start();新线程(task3).start();}privateclassMyTask1implementsRunnable{@Overridepublicvoidrun(){//循环输出for(inti=0;i<100;i++){System.out.print("A"+i+"\t");}}}privateclassMyTask2implementsRunnable{@Overridepublicvoidrun(){//try{//Thread.sleep(1000);//}catch(InterruptedExceptione){//e.printStackTrace();//}//循环输出for(inti=0;i<100;i++){System.out.print("B"+i+"\t");}}}privateclassMyTask3implementsRunnable{@Overridepublicvoidrun(){//循环输出for(inti=0;i<100;i++){System.out.print("C"+i+"\t");}}}ScheduledExecutorServicenewFixedThreadPoolnewCachedThreadPool与newThread相比,Java提供的四种线程池的优点是:a.复用现有线程,降低对象创建和消亡的成本,具有良好的性能b.可以有效控制线程的最大并发数,提高系统资源的利用率,避免资源过度竞争和阻塞。C。提供定时执行、定时执行、单线程、并发数控制等功能。线程池真的好用。如果你在项目中通过线程池来管理线程,你会发现很多好处!阅读更多20+优秀的Android开源项目2018年Android面试题及答案——适合中高级(下)完整的AndroidStudio搭建Flutter教程【】(http://mp.weixin.qq.com/s?__b...深入理解JAVA的线程中断方式经验总结为什么子线程不能更新UI线程详解相信自己,没有不可能,只有想不到你得到的不仅仅是技术!