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が実行されています。
また、日時の表示では本スレッドが先に表示され、マルチスレッドが後に表示されています。
メインスレッドはマルチスレッドの終了を待ちません。
関連の記事