最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring boot中多線程開發(fā)的注意事項總結(jié)

 更新時間:2018年09月25日 08:57:51   作者:bigfan  
spring boot 通過任務(wù)執(zhí)行器 taskexecutor 來實現(xiàn)多線程和并發(fā)編程。下面這篇文章主要給大家介紹了關(guān)于spring boot中多線程開發(fā)的注意事項,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

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

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

注意事項

第一步我們把線程類的實例注入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類網(wǎng)上很多,可以自己搜下
  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容器當(dāng)中.

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

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

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

@Component
public class demoThread extends Thread
{
 //注意這里,如果你沒有實現(xiàn)把多線程類的實例注入到spring容器中,這里你是無法拿到其他自動裝配的對象實例的的,這也是我們第一步的意義所在。
 @Autowired
 private XxxService xxxService;

 @PostConstruct
 public void start() {
  super.start();
 }

 public void run() {
  // Ok,在這里你就可以實現(xiàn)線程要實現(xiàn)的功能邏輯了,自然也可以直接使用裝配好的sevice對象實例。
  
 }
}

 2、在程序中,需要開啟線程時啟動,比如在從kafka接收數(shù)據(jù),開啟線程處理,當(dāng)然這種情況下也需要通過第一步,把線程類實例注入到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);
   //放入線程池執(zhí)行
   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")注解設(shè)置為多例模式還是默認(rèn)單例模式。

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

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

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

總結(jié)

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

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • JavaWeb 實現(xiàn)驗證碼功能(demo)

    JavaWeb 實現(xiàn)驗證碼功能(demo)

    在 WEB-APP 中一般應(yīng)用于:登錄、注冊、買某票、秒殺等場景,大家都接觸過這個驗證碼操作,今天小編通過實例代碼給大家講解javaweb實現(xiàn)驗證碼功能,需要的朋友參考下
    2017-02-02
  • SpringBoot系列教程之dubbo和Zookeeper集成方法

    SpringBoot系列教程之dubbo和Zookeeper集成方法

    這篇文章主要介紹了SpringBoot系列教程之dubbo和Zookeeper集成方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • spring?boot中spring框架的版本升級圖文教程

    spring?boot中spring框架的版本升級圖文教程

    Spring Boot是一款基于Spring框架的快速開發(fā)框架,它提供了一系列的開箱即用的功能和組件,這篇文章主要給大家介紹了關(guān)于spring?boot中spring框架的版本升級的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 深入解析Java的Spring框架中bean的依賴注入

    深入解析Java的Spring框架中bean的依賴注入

    這篇文章主要介紹了Java的Spring框架中bean的依賴注入,講解了以構(gòu)造函數(shù)為基礎(chǔ)的依賴注入和基于setter方法的依賴注入的方式,需要的朋友可以參考下
    2015-12-12
  • Java的三種代理模式簡述

    Java的三種代理模式簡述

    這篇文章主要簡述Java的三種代理模式,java的代理模式主要包括靜態(tài)代理、動態(tài)代理、Cglib代理,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • 淺談MyBatis循環(huán)Map(高級用法)

    淺談MyBatis循環(huán)Map(高級用法)

    這篇文章主要介紹了淺談MyBatis循環(huán)Map(高級用法),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot應(yīng)用剛啟動時服務(wù)報大量超時的問題及解決

    SpringBoot應(yīng)用剛啟動時服務(wù)報大量超時的問題及解決

    在Java項目上線過程中,經(jīng)常遇到的超時問題主要是由于JVM的JIT編譯導(dǎo)致,JIT(Just-In-Time)編譯是Java虛擬機的一項技術(shù),用于提高Java應(yīng)用的性能,它通過將熱點代碼(頻繁執(zhí)行的部分)轉(zhuǎn)換成本地機器碼來優(yōu)化執(zhí)行效率
    2024-11-11
  • 解決Javaweb 提交表單到servlet時出現(xiàn)空白頁面,但網(wǎng)站不報錯問題

    解決Javaweb 提交表單到servlet時出現(xiàn)空白頁面,但網(wǎng)站不報錯問題

    這篇文章主要介紹了解決Javaweb 提交表單到servlet時出現(xiàn)空白頁面,但網(wǎng)站不報錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解如何通過Java實現(xiàn)類似Nginx代理

    詳解如何通過Java實現(xiàn)類似Nginx代理

    最近遇到一個問題,在內(nèi)網(wǎng)環(huán)境中部署的項目需要調(diào)用外網(wǎng)完成一些應(yīng)用,一般情況我們可以通過增加一臺機器,部署到可以訪問外網(wǎng)的服務(wù)器上,然后內(nèi)網(wǎng)直接連接該機器通過Nginx進行代理即可,所以本文介紹了如何通過Java實現(xiàn)類似Nginx代理,需要的朋友可以參考下
    2024-08-08
  • 超詳細(xì)的Spring Boot入門筆記(總結(jié))

    超詳細(xì)的Spring Boot入門筆記(總結(jié))

    本篇文章主要介紹了超詳細(xì)的Spring Boot入門筆記(總結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

岳阳市| 襄汾县| 观塘区| 峡江县| 仲巴县| 安国市| 沿河| 资讯 | 浠水县| 灵川县| 竹溪县| 乐清市| 原平市| 延川县| 南投市| 那坡县| 桂阳县| 仪征市| 墨玉县| 涪陵区| 冷水江市| 黄梅县| 文成县| 徐水县| 黎平县| 当阳市| 三河市| 黔西县| 保定市| 开平市| 长子县| 京山县| 大厂| 福清市| 鄂托克前旗| 滦平县| 民权县| 乌苏市| 兖州市| 新竹市| 平定县|