剛剛接觸到這個領域的時候,我感覺無從下手。一邊查資料一邊寫**看執行日誌,碰到了一些坑,也學到了很多知識—不僅僅是併發程式設計方面的,也包括spring、ioc和bean的知識。在這裡做個記錄吧!
@component
public
class
implements
@override
public
void
throws bean***ception
public
static
t getbean
(string name,class
aclass)
public()
}
啟動類main方法裡獲取bean的方法是:
getbean
("mtask"
,monitortask.
class);
monitortask類同樣要被spring管理,bean的名稱自定義為「mtask」。
這裡的原理還有待進一步挖掘。
有兩種方法可以完成這個功能。第一,定義自己的執行緒類,即extends thread類,重寫run方法,在run方法裡寫業務邏輯。然後註冊為bean,讓spring去獲取這個執行緒類,在main方法裡獲取這個bean,呼叫start方法啟動即可。第二,是自定義執行緒池,用@async和@enableasync註解去做這件事。
自定義執行緒類
首先是執行緒類
@component
("mtask"
)@scope
("prototype"
)public
class
monitortask
extends
thread
@autowired
private iapiservice iapiservice;
@override
public
void
run(
)}
啟動類裡的main方法:
public
static
void
main
(string[
] args)
結果如下,可以看到是除了main執行緒之外還有個執行緒。
這裡有一點需要注意的是,執行緒類必須要呼叫start方法才能啟動乙個新的執行緒,start方法裡呼叫了run方法,因此業務**也會執行的。如果直接呼叫run方法,就和乙個普通類沒什麼區別了(執行緒學的太差了這個地方我都犯了錯。。),驗證結果如下:
因為業務**執行很久,單執行緒,所以最下面兩行還沒列印出來,從monitortask裡列印的結果就知道是主線程。
自定義執行緒池
自定義執行緒類肉眼可見的問題是,乙個執行緒類只能有乙個run方法,如果想多開幾個執行緒,需要寫多個執行緒類,比較麻煩。可以自定義執行緒池,設定執行緒池corepoolsize、queuecapacity、maxpoolsize等引數,即可控制開闢的執行緒數量。定義執行緒池**如下:
@configuration
@enableasync
public
class
threadpoolconfig
}
測試類**如下:
@component
public
class
syntest
@async
(value =
"threadpoola"
)public
void
alert()
throws interruptedexception
@async
(value =
"threadpoola"
)public
void
apimonitor()
}
這裡,使用了兩個註解,@enableasync和@async,顯而易見,@enableasync配置可以非同步執行方法,在需要非同步執行的方法前加上@async註解,如果執行緒池配置的poolsize夠大的話,即可為每個方法分配乙個執行緒非同步執行。啟動類main方法**如下:
public
static
void
main
(string[
] args)
throws interruptedexception
自定義執行緒屬性解析還有很多東西要寫。。。。待我深入研究一 SpringBoot裡使用註解開啟多執行緒
1.第一步需要在主方法上加 enableasync註解 2.第二步建立乙個配置類,如下 configuration enableasync public class asynctaskconfig implements asyncconfigurer override bean public exc...
spring boot 整合多執行緒
配置pom檔案 org.mybatis.spring.bootgroupid mybatis spring boot starterartifactid 1.3.0version dependency org.springframework.bootgroupid spring boot confi...
SpringBoot啟動多執行緒
新建乙個執行緒池的配置類,需要被spring掃瞄到。configuration enableasync public class threadexecutorconfig 新增乙個普通類,裡面編寫需要執行的方法,方法加上 async註解,呼叫方法時自動啟動執行緒。component public c...