SpringBoot マルチスレッドのサンプル

SpringBootのマルチスレッドのサンプルです。
(確認環境:Spring Boot 2.5,JDK 11)

目次

サンプル マルチスレッドで実行する
  起動ファイル(SbApplication.java)
  コントローラ(MainController.java)
  サービスのファイル(TestService)
  設定ファイル(application.properties)
実行結果

マルチスレッドで実行する

画面にアクセスするとMainController.javaからマルチスレッドでTestServiceのメソッドを実行します。

http://localhost:8765/でアクセスします。

githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-multithread

 

起動ファイル(SbApplication.java)

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class SbApplication {

	public static void main(String[] args) {
		SpringApplication.run(SbApplication.class, args);
	}

}

8行目の@EnableAsyncは、マルチスレッドの実行に必要です。

 

コントローラ(MainController.java)

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class MainController {
	@Autowired
	TestService test;
	
	@GetMapping("/")
	public String write1() {
		Logger logger = LoggerFactory.getLogger(MainController.class);
		logger.info("main"); 
		test.getMulti(); //メソッド呼び出し1
		test.getMulti(); //メソッド呼び出し2
		System.out.println("Main=" + LocalDateTime.now());
		return "test1";
	}
}

21,22行目は、TestServiceのメソッドを呼び出しています。
マルチスレッドで実行されます。

 

サービスのファイル(TestService)

package com.example.demo;

import java.time.LocalDateTime;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class TestService {

	@Async
	public void getMulti() {
		try {
			Thread.sleep(3000); //3秒待つ
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Logger logger = LoggerFactory.getLogger(TestService.class);
		logger.info("Multi");
		System.out.println("Multi=" + LocalDateTime.now());
    }
}

マルチスレッドで実行するメソッドの前に@Asyncを追加します。

設定ファイル(application.properties)

server.port = 8765

ポート番号を変更しています。

実行結果

コンソールに以下が表示されます。
赤枠はスレッドの箇所で、本スレッドの他にtask-1とtask-2が実行されています。
また、日時の表示では本スレッドが先に表示され、マルチスレッドが後に表示されています。
メインスレッドはマルチスレッドの終了を待ちません。

関連の記事

SpringBoot フォームで入力チェック(バリデーション)

△上に戻る