マルチスレッドはThreadPoolTaskExecutorカスタムスレッドプールと非同期のマルチスレッドの呼び出しを使用してからあなたと共有するために、今日の知識や面接のプロセスを作業高周波ポイントとなっています。
一、ThreadPoolTaskExecutor
本論文では、メソッドエグゼキュータの工場出荷時の設定。
図1に示すように、コンフィギュレーション・ファイルを定義するために使用されるスレッドプールパラメータ
プロジェクトのリソースディレクトリにあるexecutor.propertiesファイルを作成し、次の設定を追加します:
# 异步线程配置
# 核心线程数
async.executor.thread.core_pool_size=5
# 最大线程数
async.executor.thread.max_pool_size=8
# 任务队列大小
async.executor.thread.queue_capacity=2
# 线程池中线程的名称前缀
async.executor.thread.name.prefix=async-service-
# 缓冲队列中线程的空闲时间
async.executor.thread.keep_alive_seconds=100
2、エグゼキュータ工場出荷時の設定
2.1、構成の詳細
@Configuration
// @PropertySource是找的target目录下classes目录下的文件,resources目录下的文件编译后会生成在classes目录
@PropertySource(value = {"classpath:executor.properties"}, ignoreResourceNotFound=false, encoding="UTF-8")
@Slf4j
public class ExecutorConfig {
@Value("${async.executor.thread.core_pool_size}")
private int corePoolSize;
@Value("${async.executor.thread.max_pool_size}")
private int maxPoolSize;
@Value("${async.executor.thread.queue_capacity}")
private int queueCapacity;
@Value("${async.executor.thread.name.prefix}")
private String namePrefix;
@Value("${async.executor.thread.keep_alive_seconds}")
private int keepAliveSeconds;
@Bean(name = "asyncTaskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
log.info("启动");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数
executor.setCorePoolSize(corePoolSize);
// 最大线程数
executor.setMaxPoolSize(maxPoolSize);
// 任务队列大小
executor.setQueueCapacity(queueCapacity);
// 线程前缀名
executor.setThreadNamePrefix(namePrefix);
// 线程的空闲时间
executor.setKeepAliveSeconds(keepAliveSeconds);
// 拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 线程初始化
executor.initialize();
return executor;
}
}
2.2、注釈
- @Configuration: @Beanによる処理の方法は、注釈付きの前記起動時にSpringコンテナは、@Configurationで注釈クラスをロードします。
- @Bean:主@Configuration注釈付きのクラスで使用されるメソッドレベルで注釈がある、それはまた@Component注釈付きクラスで使用することができます。豆idはメソッド名で追加します。
- @PropertySource:指定されたプロファイルをロードします。コンフィギュレーション・ファイルをロードする値の値は、ignoreResourceNotFoundは、ファイルをロードする場合、それを無視するかどうかのプログラムを発見していないことを意味します。デフォルトはfalseです。trueの場合、ロードされたコンフィギュレーション・ファイルの代表者が存在しない場合、プログラムは与えられていません。実際のプロジェクトの開発では、それが最善のfalseに設定されています。ファイルを繰り返しapplication.propertiesカスタム構成ファイルの属性を属性場合は、カスタムプロパティの値は、構成ファイルapplication.propertiesのプロパティをロード、上書きされたプロファイルです。
- SLF4Jの@:ロンボクログ出力ツールは、後にこのノートを追加するには、直接、各ログの出力レベルを記録する呼び出すことができます。
- @value:コンフィギュレーション・ファイルの属性を呼び出し、プロパティに値を割り当てます。
2.3スレッドプールの設定手順
- コアスレッドの数:初期化時にスレッドの数を作成するスレッドプール。場合は、スレッドのコア数、キューにタスクを超えるスレッド以外のスレッドの数。
- スレッドの最大数:のみタスクキューの後には、完全なアプリケーションは、コアスレッドの数を超えてしまいますです。スレッドのコア数よりも少ないことがありません。
タスクキュー:スレッドの数がタスクキューに芯紐の部分の数よりも大きいです。タスクキューが作成されませんコアスレッド内のスレッドの数を超えるのに十分な大きさであるならば、それはコアスレッドがタスクを完了するまで待機してから、自分のタスクのタスクキューを実行し、追加のスレッドを作成しませんでしょう。例:あなたは20個のタスクが実行されなければならない場合は、スレッドのコア数:10、最大スレッド数:20、タスクキューのサイズ:2。システムは、18個のスレッドを作成します。これは、タスクを実行する18件のスレッドがあり、タスクキューにタスクを実行します。
- アイドル時間をスレッド:スレッドがkeepAliveTimeがより多くのためのアイドル状態の場合、プール内のスレッドの数は、スレッドのコア数よりも大きい場合、スレッドが終了します。このように、スレッドプールを動的にプール内のスレッドの数を調整することができます。
- 拒否した戦略:( -スレッドのコア数-ジョブキューの数タスクの合計数) -場合は、スレッドが> 0を拒否し、それが表示されます- (スレッドのコア数、スレッドの最大数を)。例:( 12--5--2) - (8 - 5)> 0、スレッドが拒否されます。スレッドはすなわち、4つの戦略にさらに分離拒否しました。
- CallerRunsPolicy() 、メインスレッドとして、呼び出し元スレッドの実行と呼ばれます。
- AbortPolicy():直接投げます。
- DiscardPolicy():破棄。
- DiscardOldestPolicy():キュー内の最も古いタスクを捨てます。
2.4スレッドプールの設定個人の理解
- ジョブがスレッドプールに提出された場合、最初のスレッドプールのスレッドがコアミッションであるかどうかを確認してください。ない場合は、タスクを実行するスレッドを選択します。
- あなたが使命である場合はタスクキューがいっぱいになって確認してください。不満場合、タスクはジョブキューに格納されます。コアスレッドがその任務の実施を終了した後、タスクがキューに再処理作業になります。
- タスクキューがいっぱいの場合は、スレッドプール(スレッド制御の最大数)がいっぱいです参照してください。不満場合は、タスクを実行するスレッドを作成します。完全な場合は、タスクは、ポリシーの処理に従って行われることはありません。
第二に、呼び出し元のスレッドを非同期
ThreadPoolTaskExecutorは通常、一緒に@Async使用されています。この方法は、非同期呼び出し機能であることを証明するための方法論上の@Asyncコメントを追加します。@Async後ろプラススレッドプールメソッド名またはBean名、非同期スレッドは、スレッドプールのコンフィギュレーションをロードします示します。
@Component
@Slf4j
public class ThreadTest {
/**
* 每10秒循环一次,一个线程共循环10次。
*/
@Async("asyncTaskExecutor")
public void ceshi3() {
for (int i = 0; i <= 10; i++) {
log.info("ceshi3: " + i);
try {
Thread.sleep(2000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
注:@Async注釈を有効にして、@EnableAsyncが起動クラスにノートを追加してください。
マルチスレッドのシナリオの第三に、使用
1、タイミングタスク@Scheduled
// 在启动类上添加 @EnableScheduling 注解
@SpringBootApplication
@EnableScheduling
public class SpringBootStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootStudyApplication.class, args);
}
}
// @Component 注解将定时任务类纳入 spring bean 管理。
@Component
public class listennerTest3 {
@Autowired
private ThreadTest t;
// 每1分钟执行一次ceshi3()方法
@Scheduled(cron = "0 0/1 * * * ?")
public void run() {
t.ceshi3();
}
}
ceshi3()メソッドは、スレッドプールの構成、および非同期実行を呼び出します。
@Component
@Slf4j
public class ThreadTest {
/**
* 每10秒循环一次,一个线程共循环10次。
*/
@Async("asyncTaskExecutor")
public void ceshi3() {
for (int i = 0; i <= 10; i++) {
log.info("ceshi3: " + i);
try {
Thread.sleep(2000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
図2に示すように、プログラムは、マルチスレッドの非同期の実行で開始します
継承CommandLineRunnerクラスを通じて達成。
@Component
public class ListennerTest implements CommandLineRunner {
@Autowired
private ThreadTest t;
@Override
public void run(String... args) {
for (int i = 1; i <= 10; i++) {
t.ceshi();
}
}
}
@Component
@Slf4j
public class ThreadTest {
@Async("asyncTaskExecutor")
public void ceshi() {
log.info("ceshi");
}
}
3、HTTPインタフェースの定義
また、非同期インターフェース、マルチスレッドの形で呼び出すことができます。
@RestController
@RequestMapping("thread")
public class ListennerTest2 {
@Autowired
private ThreadTest t;
@GetMapping("ceshi2")
public void run() {
for (int i = 1; i < 10; i++) {
t.ceshi2();
}
}
}
@Component
@Slf4j
public class ThreadTest {
@Async("asyncTaskExecutor")
public void ceshi2() {
for (int i = 0; i <= 3; i++) {
log.info("ceshi2");
}
}
}
4、試験クラス
@RunWith(SpringRunner.class)
@SpringBootTest
public class ThreadRunTest {
@Autowired
private ThreadTest t;
@Test
public void thread1() {
for (int i = 1; i <= 10; i++) {
t.ceshi4();
}
}
}
@Component
@Slf4j
public class ThreadTest {
@Async("asyncTaskExecutor")
public void ceshi4() {
log.info("ceshi4");
}
}
IVの概要
上記関連する注記の設定ThreadPoolTaskExecutorスレッドプール、使用、意義と役割を説明し、また、非同期の使用を簡単に紹介は@Asyncスレッドを呼び出し、最後にリストされているマルチスレッドの使用シナリオ、およびサンプルコードを伴います。気に入ってもらえるといいのですが。