java 线程不足_JAVA多线程创建、使用看这一篇就够了

多线程

Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。

这里定义和线程相关的另一个术语 -

进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。

多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

线程的生命周期

线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

下图显示了一个线程完整的生命周期。

68bfdf3476ef0c6acd06a67b23f67ce1.gif

以上介绍来源于菜鸟教程,下面我们将进行多线程的使用,在这里如果多多线程并不了解的同鞋,请自行百度一下!

创建线程池

这里为何要创建线程池呢?这好像还是面试官经常问的问题!

其实明白为何创建书库连接池就明白为何创建线程池了,道理其实差不多,都是为了减小服务的开销!

创建的方式很多,这里小编讲解两种方式

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循环进行调用,效果如下图

68bfdf3476ef0c6acd06a67b23f67ce1.gif

从图上可以看出,每次的调用都属于不同的线程来进行操作;

今天的分享到这里就结束了,不足之处还请多多包涵

如有帮助还请给小编点赞

小编寄语

小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发!

小编微信:372787553

备注为进群,通过后小编会邀请您进群!

Ja

va

68bfdf3476ef0c6acd06a67b23f67ce1.gif

原文始发于微信公众号(Java有货):JAVA多线程创建、使用看这一篇就够了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值