最近在使用的线程的时候,发现在自定义线程池的时候,发现核心线程满了后,再有任务需要执行,线程池不继续创建新的线程呢,而是中间放入阻塞队列。
能不能在核心线程满了后,继续创建线程,直到线程数达到最大线程数了,再把任务放入阻塞队列,任务的执行时间未知,不能拒绝任务。
那你把核心线程数设置的大一些呀
问题是并不是线程越多执行效率越高
cpu核心总共就那么多
一大堆线程在那排队分页,除了耽误时间什么作用都不起
核心线程数应该等于你的cpu核心数x2
除非你能确定这些线程大部分时间都是在阻塞等待IO而不吃cpu
而如果是并发读写文件,瓶颈本身就在硬盘上,线程越多硬盘越慢
除非固态硬盘否则不要搞多线程读写多文件
Java多线程的执行顺序是不确定的,这是因为多个线程在执行的过程中是同时运行的,操作系统会负责多个线程在CPU上的安排与调度。线程调度是由操作系统完成的,Java虚拟机并不能保证线程的执行顺序。
Java多线程运行状态的转换包括:新建、就绪、运行、阻塞、死亡。其中,就绪状态的线程是可以被操作系统任意调度的,因此它们的执行顺序是不确定的。即使我们在代码中设置了线程的优先级,也不能保证高优先级的线程一定先被执行完毕。
如果需要多个线程之间有序执行,可以使用Java并发编程中提供的同步机制,例如锁、信号量、阻塞队列等工具类来实现线程的同步与通信。同时还可以使用Java中提供的线程池等机制来控制多线程的执行顺序。