多线程
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
这里定义和线程相关的另一个术语 -
进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
线程的生命周期
线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
下图显示了一个线程完整的生命周期。
以上介绍来源于菜鸟教程,下面我们将进行多线程的使用,在这里如果多多线程并不了解的同鞋,请自行百度一下!
创建线程池
这里为何要创建线程池呢?这好像还是面试官经常问的问题!
其实明白为何创建书库连接池就明白为何创建线程池了,道理其实差不多,都是为了减小服务的开销!
创建的方式很多,这里小编讲解两种方式
1. 基于JDK创建
1.1 创建
@Bean
public ExecutorService getExecutorTools(){
// 获取计算机有几个核
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(processors * 5);
return executorService;
}
这里有四大种类方式供我们选项
1. newFixedThreadPool//指定大小
2. newCachedThreadPool//缓存类型,大小不受限制
3. newSingleThreadExecutor//单线程化
4. newScheduleThreadPool//带有生命周期的
1.2 使用
@Autowired
private ExecutorService executorService;
public void deleteFutureJdk(String id) {
try {
executorService.execute(new Runnable() {
@Override
public void run() {
int i = sysMeunMapper.deleteByIds(id);
log.info("delete num : " + i);
log.info("thread id : " + Thread.currentThread().getId());
log.info("thread name : " + Thread.currentThread().getName());
log.info("thread thread group : " + Thread.currentThread().getThreadGroup());
}
});
}catch (Exception e){
e.printStackTrace();
}finally {
executorService.shutdown();
}
}
//可以写一个for循环进行测试,通过log输出,查看线程使用的情况
2. 基于Spring创建
2.1. 创建
@EnableAsync
@Configuration
@ComponentScan(value = "com.javayh.service")
public class ExecutorConfig implements AsyncConfigurer {
@Bean
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(10);
//配置队列大小
executor.setQueueCapacity(400);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("javayh-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler();
}
}
2.2 使用
@Async
public Future> queryFuture() {
Future> future = new AsyncResult<>(sysMeunMapper.selectAll());
return future;
}
效果展示
我们写一个简单的for循环进行调用,效果如下图
从图上可以看出,每次的调用都属于不同的线程来进行操作;
今天的分享到这里就结束了,不足之处还请多多包涵
如有帮助还请给小编点赞
小编寄语
小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发!
小编微信:372787553
备注为进群,通过后小编会邀请您进群!
Ja
va
有
货
因
您
而
美
原文始发于微信公众号(Java有货):JAVA多线程创建、使用看这一篇就够了