亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

spring boot中多線程開發的注意事項總結

2024-07-14 08:42:24
字體:
來源:轉載
供稿:網友

前言

Springt通過任務執行器(TaskExecutor)來實現多線程和并發編程。使用ThreadPoolTaskExecutor可實現一個基于線程池的TaskExecutor。而實際開發中任務一般是非阻礙的,即異步的,所以我們要在配置類中通過@EnableAsync 開啟對異步任務的支持,并通過實際執行Bean的方法中使用@Async注解來聲明其是一個異步任務。

基于springboot的多線程程序開發過程中,由于本身也需要注入spring容器進行管理,才能發揮springboot的優勢。所以這篇文字主要用來記錄開發中兩者結合時需要注意的一些事項。

注意事項

第一步我們把線程類的實例注入sping容器進行管理

@Configuration@SpringBootApplication@Import({ThreadConfig.class})public class ThreadApp implements CommandLineRunner{ public static void main(String[] args) throws Exception {  ApplicationContext app = SpringApplication.run(ThreadApp .class, args);  //這里主要保存上下文對象實例,需要加上。SpringBootUtils類網上很多,可以自己搜下  SpringBootUtils.setApplicationContext(app); } //access command line arguments @Override public void run(String... args) throws Exception {  //do something }}//ComponentScan注解會掃描com.demo.thead下,也就是多線程類所在的包下的文件@Configuration@ComponentScan(basePackages = { "com.demo.thread"})public class ThreadConfig{}

這里使用springboot @Import 注解,把ThreadConfig里掃描到的包中帶注解的示例,如@Component等注入到spring容器當中.

然后是線程的啟動,這里在我的業務場景中有兩種情況:

1、程序運行時,自動啟動;

這在一般的可執行程序里面,當然可以直接在main函數里執行通過代碼啟動線程。但在springboot中,我們可以使用@PostConstruct注解的方式,讓已經注入bean容器的線程對象自啟動

@Componentpublic class demoThread extends Thread{ //注意這里,如果你沒有實現把多線程類的實例注入到spring容器中,這里你是無法拿到其他自動裝配的對象實例的的,這也是我們第一步的意義所在。 @Autowired private XxxService xxxService; @PostConstruct public void start() {  super.start(); } public void run() {  // Ok,在這里你就可以實現線程要實現的功能邏輯了,自然也可以直接使用裝配好的sevice對象實例。   }}

 2、在程序中,需要開啟線程時啟動,比如在從kafka接收數據,開啟線程處理,當然這種情況下也需要通過第一步,把線程類實例注入到sping容器中

private TaskThread thread; private ExecutorService taskPool= new ThreadPoolExecutor(   5, 10, 1000,   TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10),   new ThreadPoolExecutor.CallerRunsPolicy());  @KafkaListener(topics = "xxTopic") public void receive(ConsumerRecord<Object, Object> consumerRecord) {   JSONObject json = JSON.parseObject(consumerRecord.value().toString());   //通過SpringBootUtils獲取線程類的實例   thread = SpringBootUtils.getBean(TaskThread.class);   //啟動線程   //new Thread(thread).start() ;    //向線程對象里傳值   thread.init(i);   //放入線程池執行   taskPool.execute(thread); }
//注意這里是否添加@Scope("prototype")注解@Component@Scope("prototype")public class TaskThread implements Runnable{  protected int value=0; @Autowired private XxxService xxxService;  //ThreadLocal 對象,單例模式下可以保證成員變量的線程安全和獨立性。 public ThreadLocal<Integer> valueLocal = new ThreadLocal < Integer > () {  @Override  protected Integer initialValue() {   return 0;  } }; protected static final Logger LOG = LoggerFactory.getLogger(GpsTaskThread.class);  @Override public final void run() {  try {    LOG.info(value+"");     } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } public void init(int Value) {  this.value=Value; }}

在這里我們需要注意,TaskThread這個線程類在spirngboot中是否要添加@Scope("prototype")注解設置為多例模式還是默認單例模式。

在單例模式下SpringBootUtils.getBean(TaskThread.class) 每次返回的都是同一個對象,雖然不需要每次都創建新的對象,但無法保證成員變量的線程安全,也就是說在線程池中的執行的線程,它們的value值是共享的。而多例模式下,由于每次創建的都是一個新的線程對象,則不存在上述問題。

所以在這里請大家注意無論是我上面的示例代碼還是平常的web開發中,spirngboot默認為單例模式,自定義的成員變量是線程不安全的,需要通過ThreadLocal 或這其他方法做同步處理。

回到我們當前的業務場景,在這里我們需要每個線程處理的value值不同,互不影響,那么通過@Scope("prototype")注解把TaskThread設置為多例模式。

總結

通過上面的示例,我們可以看到springboot與多線程的結合還是比較簡單,通過配置,我們既可以在spring容器中管理線程類,也可以在線程中使用sping容器中的對象實例。同時我們在使用的過程當中要有意識的去注意線程安全方面的問題和內部運行機制的問題。當然這里理解的還是比較淺顯,如果有不正確的地方還請大家指出與海涵。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最好看的2019的中文字幕视频| 国产在线观看91精品一区| 亚洲欧洲在线观看| 久久久噜噜噜久久中文字免| 日韩免费观看视频| 欧美理论电影网| 日本人成精品视频在线| 最近2019中文字幕在线高清| 久久av中文字幕| 欧美性猛交xxxx免费看漫画| 久久国产精品久久精品| 亚洲精品动漫100p| 欧美一区二区三区免费视| 国产一区二区三区久久精品| 欧美激情亚洲国产| 亚洲成人1234| 国产精品自产拍高潮在线观看| 最新的欧美黄色| 日本精品一区二区三区在线播放视频| 日韩高清欧美高清| 欧美在线视频观看| 国产精品丝袜一区二区三区| 亚洲精品视频久久| 91九色蝌蚪国产| 黄色精品一区二区| 91亚洲精品一区二区| 亚洲最大激情中文字幕| 欧美性猛交xxxx富婆弯腰| 久久精品91久久久久久再现| 久久久av亚洲男天堂| 成人a视频在线观看| 青青久久av北条麻妃黑人| 中文字幕国产精品久久| 久久91亚洲精品中文字幕| 国产视频精品一区二区三区| 欧美精品情趣视频| 91九色国产社区在线观看| 亚洲第一页自拍| 九九热99久久久国产盗摄| 欧美日韩国产黄| 亚洲精品成人av| 日韩精品欧美激情| 亚洲人成77777在线观看网| 国产成人亚洲精品| 亚洲一级一级97网| 夜色77av精品影院| 久久久久五月天| 中文字幕国产精品久久| 在线观看视频亚洲| 久久亚洲综合国产精品99麻豆精品福利| 亚洲嫩模很污视频| 日韩最新免费不卡| 日韩不卡中文字幕| 精品久久国产精品| 中文字幕av一区二区| 97在线视频一区| 亚洲成人精品av| 日韩网站在线观看| 91亚洲精品在线| 久久久亚洲欧洲日产国码aⅴ| 亚洲免费伊人电影在线观看av| 成人激情视频小说免费下载| 欧美巨乳美女视频| 亚洲黄色在线看| 久久久久日韩精品久久久男男| 精品亚洲一区二区| 中文字幕亚洲欧美日韩在线不卡| 亚洲tv在线观看| 亚洲欧美日韩一区二区三区在线| 国产成人中文字幕| 狠狠干狠狠久久| 亚洲男人av电影| 91中文在线观看| 欧美日韩一区二区在线播放| 97国产精品人人爽人人做| 欧美一区二区三区免费观看| 97香蕉久久夜色精品国产| 欧美日韩精品中文字幕| 国内免费久久久久久久久久久| 亚洲一区二区久久久久久久| 亚洲欧美综合另类中字| 久久精品国产视频| 成人美女av在线直播| 亚洲欧美国产另类| 欧美日韩综合视频| 日本不卡免费高清视频| 欧美日韩国产中字| 欧美孕妇性xx| 亚洲图片制服诱惑| 欧美日韩国产精品一区二区不卡中文| 热99精品只有里视频精品| 欧美日韩国产成人在线观看| 欧美精品videofree1080p| 国产精品v日韩精品| 亚洲变态欧美另类捆绑| 91美女片黄在线观看游戏| 久久色免费在线视频| 欧美夜福利tv在线| 国产成人一区二区| 成人激情在线观看| 2018国产精品视频| 55夜色66夜色国产精品视频| xvideos国产精品| 1769国内精品视频在线播放| 久久大大胆人体| 欧美视频在线观看免费网址| 精品久久久久久久大神国产| 欧美日韩精品在线视频| 在线精品国产成人综合| 在线观看国产欧美| 亚洲国产天堂久久国产91| 欧美日本在线视频中文字字幕| 久久久久久久久久久久av| www日韩中文字幕在线看| 亚洲影院污污.| 久久五月天色综合| 8x拔播拔播x8国产精品| 九九久久久久久久久激情| 国产又爽又黄的激情精品视频| 欧美国产中文字幕| 日韩大陆欧美高清视频区| 欧美大片免费看| 亚洲四色影视在线观看| 欧美激情在线一区| 欧美高清一级大片| 欧美成人免费观看| 91国自产精品中文字幕亚洲| 色视频www在线播放国产成人| 一区二区三区国产在线观看| 日本中文字幕成人| 国产成人精品一区二区在线| 欧美激情视频给我| 日韩综合中文字幕| 高清日韩电视剧大全免费播放在线观看| 色无极亚洲影院| 欧美一二三视频| 日韩专区在线观看| 亚洲精品理论电影| 成人午夜黄色影院| 欧美激情xxxx| 国产免费一区二区三区在线观看| 亚洲国产精品久久久久| 亚洲精品视频播放| 97碰在线观看| 日韩在线视频网| 国产精品三级美女白浆呻吟| 国产伊人精品在线| 日韩网站在线观看| 成人免费在线网址| 久久久久日韩精品久久久男男| 久久精品久久久久久国产 免费| 国产精品久久久久999| 福利二区91精品bt7086| 亚洲91av视频| 久久综合色88| 91精品国产乱码久久久久久蜜臀| 国产91露脸中文字幕在线| 伊人久久久久久久久久| 亚洲国产精久久久久久| 日韩视频亚洲视频| 色妞在线综合亚洲欧美| 在线观看国产精品日韩av| 久久精品一本久久99精品| 国产精品第一区|