SpringBoot統合編(二)非同期呼び出しAsync
79858 ワード
非同期呼び出しとは、同期呼び出しに対して、プログラムが所定の順序で一歩一歩実行されることを意味し、各ステップは前のステップの実行が完了するまで待たなければならず、非同期呼び出しは前のステップの実行が完了するまで待つ必要はありません.
非同期呼び出しの実装方法
マルチスレッド、これは多くの人が最初に考えたキーワードで、間違いなく、マルチスレッドは非同期呼び出しを実現する方法です.
非springプロジェクトで非同期呼び出しを実現するには、Runableインタフェースを自分で実現したり、Threadクラスを統合したり、jdk 1を使用したりするマルチスレッド方式を使用します.5以上のExecutorsスレッドプールが用意されています.
StrngBootでは、非同期呼び出しを実行するのに便利です.
公式の例に従って
コード入力
maven依存:
非同期呼び出しの実装方法
マルチスレッド、これは多くの人が最初に考えたキーワードで、間違いなく、マルチスレッドは非同期呼び出しを実現する方法です.
非springプロジェクトで非同期呼び出しを実現するには、Runableインタフェースを自分で実現したり、Threadクラスを統合したり、jdk 1を使用したりするマルチスレッド方式を使用します.5以上のExecutorsスレッドプールが用意されています.
StrngBootでは、非同期呼び出しを実行するのに便利です.
公式の例に従って
コード入力
maven依存:
-
-
org.springframework.boot
-
spring-boot-starter-parent
-
1.5.3.RELEASE
-
-
-
-
org.springframework.boot
-
spring-boot-starter-web
-
-
: @EnableAsync
-
@SpringBootApplication
-
@EnableAsync
-
public
class Application{
-
-
public static void main(String[] args) {
-
SpringApplication.run(Application.class, args);
-
}
-
}
Controller
@Async
-
@RestController
-
@RequestMapping(
"")
-
public
class AsyncTaskController {
-
-
@RequestMapping(
"")
-
public String doTask() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
this.task1();
-
this.task2();
-
this.task3();
-
long currentTimeMillis1 = System.currentTimeMillis();
-
return
"task :"+(currentTimeMillis1-currentTimeMillis)+
"ms";
-
}
-
-
@Async
-
public void task1() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
1000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task1 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
}
-
-
@Async
-
public void task2() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
2000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task2 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
}
-
@Async
-
public void task3() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
3000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task3 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
}
-
}
main spirngboot , :
http://localhost:8080/
:
-
task1 :1012ms
-
task2 :2009ms
-
task3 :3004ms
:
task :6002ms
!
? , , spring @Transactional ,spring @Transactional , , , , ,spring 。
, , :
Controller
-
@RequestMapping(
"")
-
@RestController
-
public
class AsyncTaskController {
-
-
@Autowired
-
private AsyncTask asyncTask;
-
-
@RequestMapping(
"")
-
public String doTask() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
asyncTask.task1();
-
asyncTask.task2();
-
asyncTask.task3();
-
long currentTimeMillis1 = System.currentTimeMillis();
-
return
"task :"+(currentTimeMillis1-currentTimeMillis)+
"ms";
-
-
}
-
}
-
@Component
-
public
class AsyncTask {
-
-
@Async
-
public void task1() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
1000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task1 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
}
-
-
@Async
-
public void task2() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
2000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task2 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
}
-
@Async
-
public void task3() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
3000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task3 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
}
-
}
-
:
-
task1 :1012ms
-
task2 :2009ms
-
task3 :3004ms
:
task :19ms
!
, ? Fature
:
-
@Component
-
public
class AsyncTask {
-
-
@Async
-
public Future
task1() throws InterruptedException {
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
1000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task1 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
return
new AsyncResult
(
"task1 ");
-
}
-
-
@Async
-
public Future
task2() throws InterruptedException {
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
2000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task2 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
return
new AsyncResult
(
"task2 ");
-
}
-
@Async
-
public Future
task3() throws InterruptedException {
-
long currentTimeMillis = System.currentTimeMillis();
-
Thread.sleep(
3000);
-
long currentTimeMillis1 = System.currentTimeMillis();
-
System.out.println(
"task3 :"+(currentTimeMillis1-currentTimeMillis)+
"ms");
-
return
new AsyncResult
(
"task3 ");
-
}
-
}
Controller
-
@RequestMapping(
"")
-
@RestController
-
public
class AsyncTaskController {
-
-
@Autowired
-
private AsyncTask asyncTask;
-
-
@RequestMapping(
"")
-
public String doTask() throws InterruptedException{
-
long currentTimeMillis = System.currentTimeMillis();
-
Future
task1 = asyncTask.task1();
-
Future
task2 = asyncTask.task2();
-
Future
task3 = asyncTask.task3();
-
String result =
null;
-
for (;;) {
-
if(task1.isDone() && task2.isDone() && task3.isDone()) {
-
// ,
-
break;
-
}
-
Thread.sleep(
1000);
-
}
-
long currentTimeMillis1 = System.currentTimeMillis();
-
result =
"task :"+(currentTimeMillis1-currentTimeMillis)+
"ms";
-
return result;
-
}
-
}
:
-
task1 :1000ms
-
task2 :2001ms
-
task3 :3001ms
:
task :4015ms
び しに し、すべてのタスクが したときにプログラムは を しました.