JVA面试题---线程篇(二)线程池
1.创建线程池有哪几种方式?
- ThreadPoolExecutor():最原始的线程池创建。
- newSingleThreadExecutor():特点在于工作线程数目被限制为1,操作一个无界的工作队列,所以它保证了所有任务都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目。
- newCachedThreadPool()它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:她会试图缓存线程并重用,,当无缓存线程可用时,就会创建新的工作线程,如果线程闲置时间超过60秒,则被终止并移出缓存,长时间闲置时,这种线程池不会消耗什么资源,其内部使用SynchronousQueue作为工作队列;
- newFixedThreadPool(int nThreads):重用指定数目(nThreads)的线程,其背后使用的是无界的工作队列,任何时候最多有nThreads个工作线程是活动的,这意味着,如果任务数超过了活动队列数目,将在工作队列中等待空闲线程的出现,如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目 nThreads
- newSingleThreadScheduledExecutor():创建单线程池,返回ScheduledExecutorService,可以进行定时或周期性的工作调度。
- newScheduledThreadPool(int corePoolSize):和newSingleThreadScheduledExecutor()类似,创建的是个ScheduledExecutorService,可以进行定时或周期性的工作调度。区别在于单一工作线程还是多个工作线程。
- newWorkStealingPool(int parallelism):内部会构造ForkJoinPool,利用Work-Stealing算法,并行的处理任务,不保证处理序列。
2.线程池都有哪些状态?
- RUNNING:最正常的状态,接受新的任务,处理等待队列中的任务。
- SHOUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。
- STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。
- TIDYING:所有的任务都销毁了。workCount为0,线程池的状态在转换为TIDYING时,会执行钩子方法terminated()。
- TERMINATED:terminated() 方法结束后,线程池会变成这个状态。
3.线程池中的submit() 和 execute() 方法有什么区别?
- execute():只能执行 Runnable类型任务。
- submit():可以执行Runnable 和 Callable类型的任务
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
