`
- 浏览:
232737 次
- 性别:
- 来自:
深圳
-
(转)ThreadPoolExecutor的执行顺序
ThreadPoolExecutor类关于排队是这样描述的:
所有 BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:
- 如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。
- 如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
- 如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
设想如下的情况,
corePoolSize=2
maximumPoolSize=6
队列大小为10
有20个任务,每个任务都需要10s才能完成,现在一次性将20个任务都放入线程池中,执行的顺序是怎么样的呢?
Thread1放入线程池,当前线程少于2,直接创建新的线程,执行
Thread2放入线程池,当前线程少于2,直接创建新的线程,执行
Thread3放入线程池,当前线程等于2,队列大小为0,加入队列,等待执行
……
Thread12放入线程池,当前线程等于2,队列大小为9,加入队列,等待执行
Thread13放入线程池,当前线程等于2,队列大小为10,无法加入队列,创建新的线程,执行
……
Thread16放入队列,当前线程等于5,队列大小为10,无法加入队列,创建新的线程,执行
Thread17放入队列,当前线程等于6,队列大小为10,无法加入队列,任务失败
……
通过以上的分析,我们发现线程池中线程的执行顺序是
1,2,13,14,15,16,3,4,5,6,7,8,9,10
17,18,19,20 失败
而并非我们希望的那样,顺序执行
http://blog.sina.com.cn/s/blog_4ada12a50100kkpx.html
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
ThreadPoolExecutor可以设置核心线程数为1,使得线程池只包含一个线程,从而保证执行顺序。示例代码如下: ```java ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new ...
然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程中被称为线程同步或线程协调。Java提供了一些高级特性来实现这样的需求,比如`Thread`类、`synchronized`关键字...
- `newSingleThreadExecutor()`创建一个单线程的线程池,所有任务都会按顺序执行。 - `newScheduledThreadPool(int n)`创建一个支持定时及周期性任务执行的线程池,可以设定延迟或周期性执行任务。 `...
队列化执行是一种策略,用于管理多个线程的执行顺序,通常与事件驱动编程相结合,以确保线程安全和高效的工作流程。 在Java中,我们通常使用`ExecutorService`和`BlockingQueue`来实现队列化执行。`ExecutorService...
newSingleThreadExecutor创建一个只包含一个线程的线程池,适合用于执行顺序任务。newCachedThreadPool创建一个缓存线程池,线程池中线程的数量可以动态变化。 ThreadPoolExecutor的execute方法是将任务提交到...
在 Holder 模式中,我们使用一个公共的计数器来记录当前的执行顺序,并在每个线程中使用 while 循环来检查当前的执行顺序是否与线程的顺序相符,如果是,则执行对应的操作,并递增计数器值。 这种方法的优点是可以...
Java和Python等现代编程语言通常采用抢占式调度,由操作系统决定线程的执行顺序。 六、线程池 线程池可以预先创建一定数量的线程,复用这些线程来执行任务,有效减少了线程创建和销毁的开销。Java中的...
在这个例子中,虽然创建了多个`MyThread`实例,但它们会在单个线程中依次执行,保持执行顺序。 总的来说,Java线程池是实现并发和多线程编程的有效工具,它通过统一的线程管理策略和任务调度机制,提高了系统的并发...
2. **SingleThreadExecutor**:只有一个工作线程的线程池,所有任务按提交顺序执行,确保任务的执行顺序。它适合需要保证执行顺序或者同步的场景。 3. **CachedThreadPool**:缓存线程池,会无限创建新线程来处理...
在执行结果中,我们可以看到输出的结果是乱序的,因为子线程的执行顺序不能控制。 补充知识:在 Java 中,还有一个重要的安全机制,即安全管理器(SecurityManager)。安全管理器可以阻止利用反射,例如使用 `...
1. **线程的优先级与执行顺序**:虽然优先级较高的线程更有可能被调度,但Java线程调度器不保证任何特定的执行顺序。线程的执行还受到其他因素的影响,如线程的状态(是否运行、等待、阻塞等)以及操作系统的调度...
当一个任务被添加到队列中,线程池中的工作线程会按照顺序取出并执行这些任务。这种设计可以避免单个线程因为处理大量任务而成为瓶颈,同时允许多个任务并行执行,提高整体效率。 在Python中,`concurrent.futures`...
此线程池保证所有任务的执行顺序按照任务的提交顺序执行。 计划线程池 计划线程池是指可以计划执行任务的线程池,例如在指定的时间执行任务。计划线程池可以使用 ScheduledThreadPoolExecutor 类来创建。 结论 ...
综上所述,"android 系统应用程序 网络数据转串口tcpToUart"项目涵盖了Android应用开发、网络通信、串口操作、多线程编程等多个方面,需要开发者具备扎实的技术基础和实践经验。项目中的"tcp2uart"和"eloop"可能是...
这允许我们在一个任务完成后再开始下一个任务,而不是同步地顺序执行。在Django视图中,我们可能这样使用它: ```python works = [asyncio.ensure_future(self.io_task3(5)), ...] results = loop.run_until_...
这个线程池适用于需要保证执行顺序的场景,比如日志记录或者数据库事务。 4. **ScheduledThreadPool**: `Executors.newScheduledThreadPool(int corePoolSize)`创建一个支持定时及周期性任务执行的线程池。它可以...
在Python爬虫中,如果多个线程同时请求不同的网页,它们的完成顺序无法预测,这就是所谓的线程间执行无序性。这种无序性可能导致数据的混合或者竞态条件,需要开发者采取适当的同步措施,如使用锁、信号量等,以确保...
这意味着所有任务都在同一个线程中执行,保证了执行顺序,按照任务的提交顺序依次执行。 - 它内部包装了一个`FinalizableDelegatedExecutorService`,使得线程池一旦创建,就不能再修改其参数,确保了线程池的单一...
任务队列通过调度策略来决定任务的执行顺序,如先入先出(FIFO)、优先级排序等。 线程池的常见类型: 1. `SingleThreadExecutor`:只有一个工作线程,确保任务按顺序执行,适合用于需要保持顺序的场景。 2. `...
串行执行是指程序按照代码的顺序逐行执行,而并行执行则允许同时处理多个任务,从而极大地提高了效率。 在给出的示例中,可以看到代码使用了Python的`threading`模块来实现并行执行。`threading`模块是Python标准库...