/**
* Created by zhiqi.shao on 2018/4/3.
*/
@EnableAsync
@Configuration
public class TaskPoolConfig {
@Bean("taskExecutor"
)
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor =
new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10
);
executor.setMaxPoolSize(20
);
executor.setQueueCapacity(200
);
executor.setKeepAliveSeconds(60
);
executor.setThreadNamePrefix("taskExecutor-"
);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
/**
* 上面我们通过使用 ThreadPoolTaskExecutor创建了一个线程池,同时设置了以下这些参数:
核心线程数10:线程池创建时候初始化的线程数
最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
缓冲队列200:用来缓冲执行任务的队列
允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
线程池对拒绝任务的处理策略:这里采用了 CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
*/
}
/**
* Created by zhiqi.shao on 2018/4/3.
*/
@Component
@Slf4j
public class Task {
public static Random random =
new Random();
/**
* 在定义了线程池之后,我们只需要在 @Async注解中指定线程池名即可,比如:
* @throws Exception
*/
@Async("taskExecutor"
)
public void dotaskOne()
throws Exception{
log.info("任务一开始"
);
long start=
System.currentTimeMillis();
Thread.sleep(random.nextInt(10000
));
long end=
System.currentTimeMillis();
log.info("完成任务一耗时:{} 毫秒",(end-
start));
}
@Async("taskExecutor"
)
public void dotaskTwo()
throws Exception{
log.info("任务二开始"
);
long start=
System.currentTimeMillis();
Thread.sleep(random.nextInt(10000
));
long end=
System.currentTimeMillis();
log.info("完成任务二耗时:{} 毫秒",(end-
start));
}
@Async("taskExecutor"
)
public void dotaskThree()
throws Exception{
log.info("任务三开始"
);
long start=
System.currentTimeMillis();
Thread.sleep(random.nextInt(10000
));
long end=
System.currentTimeMillis();
log.info("完成任务三耗时:{} 毫秒",(end-
start));
}
/**
* Created by zhiqi.shao on 2018/4/3.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes =MytestApplication.
class)
@WebAppConfiguration
public class TestAsync {
@Autowired
private Task task;
@Test
public void test()
throws Exception{
task.dotaskOne();
task.dotaskTwo();
task.dotaskThree();
Thread.currentThread().join();
}
}
转载于:https://www.cnblogs.com/shaozhiqi/p/8708518.html
转载请注明原文地址: https://mac.8miu.com/read-73620.html