jdk8新特性(Lambda表示式)結合spring 執行緒池,一行程式碼實現多執行緒
阿新 • • 發佈:2018-12-21
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; } }