java中的異步加載new Thread()方式
java的異步加載new Thread()
public class LoginInterface{
? ?public String delSession(){
? ? new Thread(new Runnable() { @Override public void run() { //需要執(zhí)行的代碼 } }).start();
? ?}}使用匿名內(nèi)部類(lèi)編譯
class LoginInterface$1
? implements Runnable
{
? LoginInterface$1(LoginInterface paramLoginInterface, String paramString)
? {
? }
? public void run()
? {
//要執(zhí)行的代碼
? }
}聊聊new Thread()的危害
危害
1)開(kāi)銷(xiāo)大
每次new Thread() 都會(huì)創(chuàng)建新的對(duì)象,開(kāi)銷(xiāo)較大,無(wú)法復(fù)用增加垃圾回收的負(fù)擔(dān)。
2)管理困難
每個(gè)new Thread() 都是獨(dú)立的個(gè)體,無(wú)法有效的管控,無(wú)限制創(chuàng)建相互競(jìng)爭(zhēng),可能導(dǎo)致oom或者核心業(yè)務(wù)線程阻塞。
3)功能單一
無(wú)法定時(shí)執(zhí)行,中斷線程等功能。
線程池
1)復(fù)用已創(chuàng)建的線程,減少對(duì)象創(chuàng)建、消亡的開(kāi)銷(xiāo),性能佳。
2)可控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過(guò)多資源競(jìng)爭(zhēng),避免堵塞。
3)可定時(shí)執(zhí)行、中斷線程等功能。
線程池大小
1)CPU密集型(計(jì)算型)
- 使用較小的線程池,一般是Cpu核心數(shù)+1
- 因?yàn)镃PU密集型任務(wù)CPU的使用率很高,若開(kāi)過(guò)多的線程,只能增加線程上下文的切換次數(shù),帶來(lái)額外的開(kāi)銷(xiāo)
2)IO密集型(查詢?cè)L問(wèn)型)
- 使用較大的線程池,一般CPU核心數(shù) * 2
- 因?yàn)镮O密集型CPU使用率不高,可以讓CPU等待IO的時(shí)候處理別的任務(wù),充分利用cpu時(shí)間
線程池創(chuàng)建【使用ThreadPoolExecutor手動(dòng)創(chuàng)建】
public class CommonThreadPool {
/**
* 線程池對(duì)象
*/
public static ExecutorService pool = null;
/**
* 線程池核心池的大小
*/
private static final int CORE_POOL_SIZE = 5;
/**
* 獲取當(dāng)前系統(tǒng)的CPU 數(shù)目
*/
private static int cpuNums = Runtime.getRuntime().availableProcessors();
/**
* 線程池的最大線程數(shù)
*/
private static final int MAX_POOL_SIZE = (cpuNums * 2) > CORE_POOL_SIZE ? (cpuNums * 2) : CORE_POOL_SIZE;
static {
pool = new ThreadPoolExecutor(
CORE_POOL_SIZE, // 核心線程數(shù)
MAX_POOL_SIZE, // 最大線程數(shù) 通常核心線程數(shù)=最大線程數(shù) 當(dāng)MAX_POOL_SIZE > CORE_POOL_SIZE 時(shí),并不是當(dāng)核心線程全部被占用后立馬開(kāi)始創(chuàng)建新的線程(只有在隊(duì)列也滿了之后才會(huì)開(kāi)始新建線程)
0L, // 存活時(shí)間 >=0 0 永不回收【非核心線程除外】
TimeUnit.MILLISECONDS, // 單位
new ArrayBlockingQueue<Runnable>(100), // 隊(duì)列 存放待執(zhí)行任務(wù)
new ThreadFactoryBuilder().setNameFormat("CommonThread-%d").build(), // 創(chuàng)建工廠
new ThreadPoolExecutor.AbortPolicy()); // 拒絕策略 默認(rèn)拒絕 丟棄 丟棄最老的 主線程執(zhí)行
}
}禁用Executors創(chuàng)建線程池
1)Executors屏蔽的線程池的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),開(kāi)發(fā)人員需要根據(jù)服務(wù)器情況與業(yè)務(wù)場(chǎng)景定義更合適的線程池。
2)newFixedThreadPool 和 newSingleThreadExecutor的主要問(wèn)題是堆積的請(qǐng)求處理隊(duì)列可能會(huì)耗費(fèi)非常大的內(nèi)存,甚至 OOM。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}3)newCachedThreadPool 和 newScheduledThreadPool:主要問(wèn)題是線程數(shù)最大數(shù)是 Integer.MAX_VALUE,可能會(huì)創(chuàng)建數(shù)量非常多的線程,甚至 OOM。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}- LinkedBlockingQueue:隊(duì)列默認(rèn)大小Integer.MAX_VALUE,未指定大小時(shí)可以視為無(wú)界隊(duì)列。
- SynchronousQueue:隊(duì)列大容量為0,不存儲(chǔ)任何數(shù)據(jù)。
- DelayedWorkQueue:無(wú)界,隊(duì)列順序按照延時(shí)時(shí)長(zhǎng)排序。
任務(wù)執(zhí)行流程

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息示例
這篇文章主要介紹了Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息,結(jié)合實(shí)例形式分析了Java微信公眾號(hào)獲取微信用戶信息相關(guān)原理、步驟與操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
Spring?Boot自動(dòng)配置源碼實(shí)例解析
Spring Boot作為Java領(lǐng)域最為流行的快速開(kāi)發(fā)框架之一,其核心特性之一就是其強(qiáng)大的自動(dòng)配置機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot自動(dòng)配置源碼的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
OAuth2生成token代碼備忘實(shí)現(xiàn)過(guò)程示例
這篇文章主要為大家介紹了OAuth2生成token代碼備忘實(shí)現(xiàn)過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
java如何刪除以逗號(hào)隔開(kāi)的字符串中某一個(gè)值
這篇文章主要介紹了java如何刪除以逗號(hào)隔開(kāi)的字符串中某一個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)
這篇文章主要介紹了java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-07-07
Java實(shí)現(xiàn)字符串的分割(基于String.split()方法)
Java中的我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)字符串的分割的相關(guān)資料,是基于jDK1.8版本中的String.split()方法,需要的朋友可以參考下2022-09-09

