1. 程式人生 > >jdk8新特性(Lambda表示式)結合spring 執行緒池,一行程式碼實現多執行緒

jdk8新特性(Lambda表示式)結合spring 執行緒池,一行程式碼實現多執行緒

1.配置spring 執行緒池

@Configuration
@EnableAsync
@ConfigurationProperties(prefix="threadpool")
public class ExecutePoolConfiguration {

    @Value("${threadpool.core-pool-size}")
    private int corePoolSize;

    @Value("${threadpool.max-pool-size}")
    private int maxPoolSize;

    @Value("${threadpool.queue-capacity}")
    private int queueCapacity;

    @Value("${threadpool.keep-alive-seconds}")
    private int keepAliveSeconds;


    @Bean(name="threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setKeepAliveSeconds(keepAliveSeconds);
        pool.setCorePoolSize(corePoolSize);//核心執行緒池數
        pool.setMaxPoolSize(maxPoolSize); // 最大執行緒
        pool.setQueueCapacity(queueCapacity);//佇列容量
        pool.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy()); //佇列滿,執行緒被拒絕執行策略
        return pool;
    }
}

2.在配置檔案裡面增加配置

threadpool:
  core-pool-size: 30
  max-pool-size: 40
  queue-capacity: 1000
  keep-alive-seconds: 300

3.實現多執行緒

@Component
public class Demo {
	
	@Autowired
	private ThreadPoolTaskExecutor threadPoolTaskExecutor;

	
	
	public void test() {
		List<Integer> array = new ArrayList<Integer>();
		for(int i=1;i<1000;i++) {
			array.add(i);
		}
		//把上述1000條資料,分5個執行緒處理
		averageAssign(array,5).forEach(
				l -> threadPoolTaskExecutor.execute(
						()->l.forEach(
								m ->System.out.println(m
										)
								)
						)
				);						
		
	}

        public  <T> List<List<T>> averageAssign(List<T> source, int n) {
	    List<List<T>> result = new ArrayList<List<T>>();
	    int remainder = source.size() % n;  //(先計算出餘數)
	    int number = source.size() / n;  //然後是商
	    int offset = 0;//偏移量
	    for (int i = 0; i < n; i++) {
	        List<T> value = null;
	        if (remainder > 0) {
	            value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
	            remainder--;
	            offset++;
	        } else {
	            value = source.subList(i * number + offset, (i + 1) * number + offset);
	        }
	        result.add(value);
	    }
	    return result;
	}
}