1. 程式人生 > 實用技巧 >SpringBoot 執行緒池(一):使用同步執行緒池

SpringBoot 執行緒池(一):使用同步執行緒池

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 總結

由上述結果可見:使用執行緒池執行批量任務速度要快。