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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM