SpringBoot 執行緒池(一):使用同步執行緒池
阿新 • • 發佈:2020-12-21
SpringBoot 執行緒池(一):使用同步執行緒池
1 建立任務
1.1 建立同步任務類 SyncTask
建立同步任務類 SyncTask
,新增 @Component
註釋
1.2 建立需要執行的任務
為了測試方便,只打印一行資訊
/** * 同步任務 */ public void sync() { try { System.out.println(Thread.currentThread().getName() + ":sync execute task..."); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
1.3 建立執行緒池、任務執行呼叫方法
/** 同步任務執行緒池 */ private final ExecutorService executorService = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(50), new ThreadFactoryBuilder().setNameFormat("sync-task-thread-pool-%d").build()); /** * 執行方法 */ public void execute() { // 提交任務給執行緒池 executorService.submit(this::sync); }
1.4 SyncTask 類完整程式碼
@Component public class SyncTask { /** 同步任務執行緒池 */ private final ExecutorService executorService = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(50), new ThreadFactoryBuilder().setNameFormat("sync-task-thread-pool-%d").build()); /** * 同步任務 */ public void sync() { try { System.out.println(Thread.currentThread().getName() + ":sync execute task..."); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 執行方法 */ public void execute() { // 提交任務給執行緒池 executorService.submit(this::sync); } }
2 建立單元測試進行測試
本次使用 JUnit5
進行測試,完整程式碼如下:
2.1 不使用執行緒池
@SpringBootTest
class StudyApplicationTests {
@Autowired
SyncTask syncTask;
@Test
public void syncWithoutThreadPool() {
System.out.println("start execute task...");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10 ; i++) {
syncTask.sync();
}
long endTime = System.currentTimeMillis();
System.out.println("total time:" + (endTime - startTime));
}
}
列印日誌結果:
start execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
main:sync execute task...
total time:10117
2.2 使用執行緒池
@SpringBootTest
class StudyApplicationTests {
@Autowired
SyncTask syncTask;
@Test
public void syncWithThreadPool() {
System.out.println("start execute task...");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10 ; i++) {
syncTask.execute();
}
long endTime = System.currentTimeMillis();
System.out.println("total time:" + (endTime - startTime));
}
}
列印日誌結果:
start execute task...
sync-task-thread-pool-0:sync execute task...
sync-task-thread-pool-1:sync execute task...
sync-task-thread-pool-2:sync execute task...
sync-task-thread-pool-3:sync execute task...
sync-task-thread-pool-4:sync execute task...
sync-task-thread-pool-5:sync execute task...
sync-task-thread-pool-6:sync execute task...
sync-task-thread-pool-7:sync execute task...
sync-task-thread-pool-8:sync execute task...
total time:2
sync-task-thread-pool-9:sync execute task...
3 總結
由上述結果可見:使用執行緒池執行批量任務速度要快。