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 總結
由上述結果可見:使用線程池執行批量任務速度要快。