序文
スレッドプールは、名前から、保存されたスレッド「プール」は、すべてがその真実を持っているということです、それがあるスレッドプールのメリット?
私たちは、コンピュータが実際に、スレッドを使用している、いくつかのライブをやりたい、それが新しい使用することですRunnable
インターフェイスをかから継承された新しいサブクラス、作成Thread
スレッドオブジェクトの作成と破棄が参加するクラスを、これら2つの操作が間違いなくなります私たちのシステムは、この問題を解決するためにどのようにして、プロセッサリソースを消費していますか?実際には、スレッドプールは、この問題の学生を解決することです。
スレッドプールは、複数のタスクによって、システムのパフォーマンスとユーザーの要求の大規模な量との競合を処理する方法であって重用
、既に存在していることをスレッドオブジェクトを伴うとき、顧客の要求時にスレッドオブジェクトの作成と破棄のオーバーヘッドを低減し、スレッドオブジェクト已经存在
あなたは、システムサービスの全体的なパフォーマンスを向上させるために、要求の応答時間を改善することができます。
このブログは、どのような非同期の概念、春に非同期スレッドプールを使用する方法を、まとめあなたの例を与える、理解することです
分析を報告するバックオフィスのインターン担当する王、彼の作品は、バックエンド・システムを操作するための責任があり、データのレポートを生成するためのボタンをクリックして、レポートを生成し、大量のデータによるレポートを参照してくださいする必要はありませんが、長い時間がかかるし、もしスレッド内のレポートや他の作業を生成し、王はので、他のスレッドは、コンピュータに、このタスクのレポートを生成する必要があり、これは非同期反映され、他の作業を行うことはできません。
春に非同期スレッドプールを使用します
春は提供AsyncConfigurer
当社独自の非同期スレッドプールの簡単な設定のための設定インターフェイスを。
新しい非同期コンフィギュレーションクラス
私は、新しい設定パッケージを作成するために使用され、その後、いくつかのコンポーネントは、構成クラスの内側に配置されています
package com.example.wyh.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
/**
* @author 阳光大男孩!!!
*/
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
//定义线程池
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
//设置核心线程数
threadPoolTaskExecutor.setCorePoolSize(10);
//设置线程池最大线程数
threadPoolTaskExecutor.setMaxPoolSize(30);
//设置线程队列最大线程数
threadPoolTaskExecutor.setQueueCapacity(2000);
//初始化线程池
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
上記のコードでは、使用@Configuration
注釈が使用して、この春には、構成クラスで伝えるために@EnableAsync
、スプリングが非同期的に利用でき回してみましょう。あなたは、非同期タスクは別のスレッドでメソッドを入れたいのであればということは、後に、唯一の方法を追加する必要があります@Async
コメントに。
新しいサービス・インターフェースを作成し、達成するために
package com.example.wyh.Service;
/**
* @author 阳光大男孩!!!
*/
public interface AsyncService {
/**
* 测试使用异步线程池来执行工作
*/
public void useAsyncThreadWork();
}
package com.example.wyh.Service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* @author 阳光大男孩!!!
*/
@Service
public class AsyncServiceImp implements AsyncService{
@Override
@Async
public void useAsyncThreadWork() {
System.out.println(Thread.currentThread().getName());
}
}
タスクは心のスレッドで実行されたかどうかを確認するためによるので、インタフェースの特定の実装では、我々は、現在のスレッドの名前を印刷します。そして、により@Service
、スプリング注釈サービスを伝える。このように、我々は独自のコンテナを介して、私たちのオブジェクトを管理するために、スプリングを作ることができることを、豆の種類であるIOC
特性の現れ。
アクセスに新しいコントローラを作成し、テスト
/**
* @author 阳光大男孩!!!
*/
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@GetMapping("/testAsync")
public String testAsync()
{
System.out.println(Thread.currentThread().getName());
asyncService.useAsyncThreadWork();
return "testAsync方法执行成功...";
}
}
私たちが使用し、上記のコードで見ることができる@Autowired
だけでマネージアセンブリの自動化SpringコンテナにメモをService
するバネであるクラスオブジェクトを達成するために、DI
具体化特性。
私は8090ポートをドライブするので、私の訪問がポート8090にしたので、
二つのスレッドの印刷された名前を見ることができ、最初はコントローラー内のスレッドの実行の名前で、二つ目は、私たちの以前の構成によってばねであります私たちは、スレッドプールから抽出されたということであるため、適切なタスクを実行します。
概要
このブログについての基本的な方法は、春にタスクを実行するために、非同期スレッドプールを使用して、それがプロジェクトに非同期スレッドプールの使用例を提供します。