面試官:如何合理的配置線程數(shù)?越多越好嗎?
1
(1)CPU密集型:
定義:CPU密集型的意思就是該任務需要大量運算,而沒有阻塞,CPU一直全速運行。
CPU密集型任務只有在真正的多核CPU上才可能得到加速(通過多線程)。
CPU密集型任務配置盡可能少的線程數(shù)。
CPU密集型線程數(shù)配置公式:(CPU核數(shù)+1)個線程的線程池
(2)IO密集型:
定義:IO密集型,即該任務需要大量的IO,即大量的阻塞。
在單線程上運行IO密集型任務會導致浪費大量的CPU運算能力浪費在等待。
所以IO密集型任務中使用多線程可以大大的加速程序運行,即使在單核CPU上,這種加速主要利用了被浪費掉的阻塞時間。
第一種配置方式:
由于IO密集型任務線程并不是一直在執(zhí)行任務,則應配置盡可能多的線程。
配置公式:CPU核數(shù) * 2。
第二種配置方式:
IO密集型時,大部分線程都阻塞,故需要多配置線程數(shù)。
配置公式:CPU核數(shù) / (1 – 阻塞系數(shù))(0.8~0.9之間)
比如:8核 / (1 – 0.9) = 80個線程數(shù)
2
/**
?* 自定義線程池
?*/
public?class?ThreadPoolDemoFour?{
????public?static?void?main(String[] args) {
????????// 自定義線程池
????????ExecutorService threadPool = new?ThreadPoolExecutor(3,
????????????????5,
????????????????60,
????????????????TimeUnit.SECONDS,
????????????????new?LinkedBlockingQueue<>(1),
????????????????Executors.defaultThreadFactory(),
????????????????new?ThreadPoolExecutor.AbortPolicy());
?
????????try?{
????????????for?(int?i = 0; i < 10; i++) {
????????????????threadPool.execute(() -> {
????????????????????System.out.println(Thread.currentThread().getName() + "\t 辦理業(yè)務");
????????????????});
????????????}
????????} catch?(Exception e) {
????????????e.printStackTrace();
????????} finally?{
????????????threadPool.shutdown();
????????}
????}
}3
【強制】線程資源必須通過線程池提供,不允許在應用中自行顯式創(chuàng)建線程。說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所消耗的時間以及系統(tǒng)資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導致消耗完內(nèi)存或者“過度切換”的問題。
【強制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風險。說明:Executors返回的線程池對象的弊端如下:
FixedThreadPool和SingleThreadPool: 允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM。
CachedThreadPool和ScheduledThreadPool: 允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而導致OOM。

來源:lixinkuan.blog.csdn.net/article/details/94501073
往期推薦
