创建线程的方式? 线程池工作原理 ?线程池拒绝策略?
时间: 2023-11-12 15:42:48 浏览: 44
1. 创建线程的方式有三种,分别为继承Thread类、实现Runnable接口和使用线程池。
2. 线程池工作原理:线程池是一种预先创建一定数量的线程,并将它们保存在一个线程池中,等待分配任务并执行。线程池通过控制线程的数量和重复利用已创建的线程来优化系统性能和资源消耗。当一个任务到达线程池时,线程池中的一个线程会被分配给这个任务进行处理。当这个任务完成之后,该线程不会被销毁,而是继续等待执行下一个任务。这样,线程池就可以避免频繁地创建和销毁线程,从而提高系统的性能。
3. 线程池拒绝策略:当线程池中的线程数量达到设定的最大值,并且任务队列中的任务也已满时,新来的任务就会被拒绝执行。此时,线程池需要采取一些拒绝策略来处理这些任务。常见的拒绝策略有以下几种:
- AbortPolicy:默认的拒绝策略,直接抛出RejectedExecutionException异常。
- CallerRunsPolicy:在当前线程中执行任务。这样做的好处是可以避免任务的丢失,但是会影响当前线程的性能。
- DiscardPolicy:直接丢弃任务,不做任何处理。
- DiscardOldestPolicy:丢弃队列中最早的任务,然后尝试重新提交新的任务。
相关问题
Java线程池的实现原理是什么?线程池中线程的调度过程
Java线程池的实现原理是通过Executor框架来实现的。Executor框架提供了一种将任务提交和任务执行解耦的机制,使得开发者可以专注于任务的实现,而不需要关心线程的创建和管理。
线程池中线程的调度过程如下:
1. 当有任务需要执行时,首先判断线程池中的线程是否都在执行任务,如果有空闲线程,则选择一个空闲线程执行任务。
2. 如果所有线程都在执行任务,但是任务队列未满,则将任务添加到任务队列中等待执行。
3. 如果任务队列已满,但是线程池中的线程数量未达到最大线程数,则创建一个新的线程执行任务。
4. 如果线程池中的线程数量已达到最大线程数,并且任务队列已满,则根据线程池的拒绝策略来处理无法执行的任务。
通过使用线程池,可以实现以下好处:
1. 提高效率:线程池中的线程可以被重复利用,避免了频繁创建和销毁线程的开销,提高了任务的执行效率。
2. 控制资源:线程池可以限制线程的数量,避免过多的线程占用过多的系统资源,保证系统的稳定性。
3. 提供任务队列:线程池中的任务队列可以缓冲任务,避免任务过多导致系统资源耗尽。
捕获线程池里面的异常,要怎么做? 线程池的参数有哪些,有了解吗?有啥要注意的? 线程池的饱和策略知道不? 线程池的工作原理了解过吗?
1. 捕获线程池里面的异常,可以通过设置ThreadPoolExecutor的UncaughtExceptionHandler来捕获未处理的异常。
2. 线程池的参数包括核心线程数、最大线程数、线程空闲时间、任务队列、线程工厂等。其中,核心线程数表示线程池中一直存在的线程数量,最大线程数表示线程池中最多能存在的线程数量,线程空闲时间表示线程在空闲时存活的时间,任务队列用于存储尚未执行的任务,线程工厂用于创建新的线程。
3. 线程池的饱和策略包括AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy。其中AbortPolicy是默认的饱和策略,当任务队列已满且线程池中的线程数达到最大线程数时,新任务将被拒绝并抛出RejectedExecutionException异常。CallerRunsPolicy会将任务回退到调用者处执行。DiscardOldestPolicy会丢弃任务队列中最旧的任务。DiscardPolicy会直接丢弃新提交的任务。
4. 线程池的工作原理如下:当有任务提交时,线程池会先判断核心线程数是否已满。如果核心线程数未满,则创建新的线程执行任务。如果核心线程数已满,则判断任务队列是否已满。如果任务队列未满,则将任务加入队列中等待执行。如果任务队列已满,则判断线程池中线程数量是否达到最大线程数。如果线程数量未达到最大线程数,则创建新的线程执行任务。如果线程数量已达到最大线程数,则根据饱和策略处理新提交的任务。