返回顶部
首页 > 资讯 > 精选 >Spring多线程怎么使用
  • 155
分享到

Spring多线程怎么使用

2023-06-30 15:06:12 155人浏览 独家记忆
摘要

这篇“spring多线程怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring多线程怎么使用”文章吧。为什么使用

这篇“spring多线程怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring多线程怎么使用”文章吧。

为什么使用多线程

在我们开发系统过程中,经常会处理一些费时间的任务(如:向数据库中插入大量数据),这个时候就就需要使用多线程。

SpringBoot中是否对多线程方法进行了封装

是,Spring中可直接由@Async实现多线程操作

如何控制线程运行中的各项参数

通过配置线程池

线程池ThreadPoolExecutor执行规则如下

Spring多线程怎么使用

然后我们来认为构造一个线程池来试一下:

@Configuration@EnableAsyncpublic class ThreadPoolConfig implements AsyncConfigurer {    private static final int CORE_POOL_SIZE = 3;    private static final int MAX_POOL_SIZE = 10;    private static final int QUEUE_CAPACITY = 10;    private static final int KEEP_ALIVE_SECONDS = 300;    @Override  @Bean  public Executor getAsyncExecutor() {    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();    executor.setMaxPoolSize(MAX_POOL_SIZE);    executor.setCorePoolSize(CORE_POOL_SIZE);    executor.setQueueCapacity(QUEUE_CAPACITY);    executor.seTKEepAliveSeconds(KEEP_ALIVE_SECONDS);    executor.setThreadNamePrefix("LiMingTest");    // 线程池对拒绝任务(无线程可用)的处理策略    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());    executor.initialize();    return executor;  }}

ThreadPoolExecutor是jdk中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交、线程管理、监控等方法。

corePoolSize:核心线程数

线程池维护的最小线程数量,默认情况下核心线程创建后不会被回收(注意:设置allowCoreThreadTimeout=true后,空闲的核心线程超过存活时间也会被回收)。

大于核心线程数的线程,在空闲时间超过keepAliveTime后会被回收。

maximumPoolSize:最大线程数

线程池允许创建的最大线程数量。

当添加一个任务时,核心线程数已满,线程池还没达到最大线程数,并且没有空闲线程,工作队列已满的情况下,创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。

keepAliveTime:空闲线程存活时间

当一个可被回收的线程的空闲时间大于keepAliveTime,就会被回收。

被回收的线程:

设置allowCoreThreadTimeout=true的核心线程。
大于核心线程数的线程(非核心线程)。

workQueue:工作队列

新任务被提交后,如果核心线程数已满则会先添加到工作队列,任务调度时再从队列中取出任务。工作队列实现了BlockingQueue接口。

handler:拒绝策略

当线程池线程数已满,并且工作队列达到限制,新提交的任务使用拒绝策略处理。可以自定义拒绝策略,拒绝策略需要实现RejectedExecutionHandler接口。

JDK默认的拒绝策略有四种:

AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy:丢弃任务,但是不抛出异常。可能导致无法发现系统的异常状态。
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
CallerRunsPolicy:由调用线程处理该任务。

我们在非测试文件中直接使用new Thread创建新线程时编译器会发出警告:

不要显式创建线程,请使用线程池。
说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题

public class TestServiceImpl implements TestService {  private final static Logger logger = LoggerFactory.getLogger(TestServiceImpl.class);  @Override  public void task(int i) {      logger.info("任务: "+i);  }}
@Autowired  TestService testService;  @Test  public void test() {    for (int i = 0; i < 50; i++) {      testService.task(i);    }

我们可以看到一切执行正常;

Spring多线程怎么使用

之后我有对线程进行了一些测试:

class TestServiceImplTest {  @Test  public void test() {    Thread add = new AddThread();    Thread dec = new DecThread();    add.start();    dec.start();    add.join();    dec.join();    System.out.println(Counter.count);  }  static class Counter {    public static int count = 0;  }  class AddThread extends Thread {    public void run() {      for (int i=0; i<10000; i++) { Counter.count += 1; }    }  }  class DecThread extends Thread {    public void run() {      for (int i=0; i<10000; i++) { Counter.count -= 1; }    }  }

一个自增线程,一个自减线程,对0进行同样次数的操作,理应结果仍然为零,但是执行结果却每次都不同。

经过搜索之后发现对变量进行读取和写入时,结果要正确,必须保证是原子操作。原子操作是指不能被中断的一个或一系列操作。

例如,对于语句: n +=1; 看似只有一行语句却包括了3条指令:

读取n, n+1, 存储n;

比如有以下两个进程同时对10进行加1操作

Spring多线程怎么使用

这说明多线程模型下,要保证逻辑正确,对共享变量进行读写时,必须保证一组指令以原子方式执行:即某一个线程执行时,其他线程必须等待。

static class Counter {    public static final Object lock = new Object();//每个线程都需获得才能执行    public static int count = 0;  }  class AddThread extends Thread {    public void run() {      for (int i=0; i<10000; i++) {        synchronized(Counter.lock) { static class Counter {    public static final Object lock = new Object();    public static int count = 0;  }  class DecThread extends Thread {    public void run() {      for (int i=0; i<10000; i++) {        synchronized(Counter.lock) {          Counter.count -= 1;        }      }    }  }

值得注意的是每个类可以设置多个锁,如果线程获取的不是同一个锁则无法起到上述功能;

springBoot中也定义了很多类型的锁,在此就不一一说明了,我们目前能做到的就是注意项目中的异步操作,观察操作所使用的线程,做到在以后项目中遇到此类问题时能及时发现问题,解决问题。

以上就是关于“Spring多线程怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Spring多线程怎么使用

本文链接: https://lsjlt.com/news/329670.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring多线程怎么使用
    这篇“Spring多线程怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring多线程怎么使用”文章吧。为什么使用...
    99+
    2023-06-30
  • spring scheduled单线程和多线程使用的坑怎么解决
    本篇内容介绍了“spring scheduled单线程和多线程使用的坑怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!公司在...
    99+
    2023-06-29
  • Python多线程怎么使用
    本篇内容主要讲解“Python多线程怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python多线程怎么使用”吧!Python 多线程多线程类似于同时执行多个不同程序,多线程运行有如下优...
    99+
    2023-06-21
  • PHP 怎么使用多线程
    PHP 语言本身不支持多线程编程。但是,我们可以使用 PHP 的多进程技术来实现多线程的效果。 常用的方法是使用 pcntl 扩展来实现。首先,我们需要在 PHP 中使用 pcntl_fork() 函数来创建子进程。然后,在子进程中使用...
    99+
    2023-09-05
    php 开发语言
  • 利用Spring 怎么将bean注入多线程
    本篇文章给大家分享的是有关利用Spring 怎么将bean注入多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题Spring中多线程注入userThreadService...
    99+
    2023-05-31
    spring 多线程 bean
  • spring多线程怎么查询数据
    在Spring中进行多线程查询数据可以使用Spring的TaskExecutor接口来实现。以下是一个简单的示例代码: 首先,配置...
    99+
    2024-04-02
  • java怎么使用线程池启动多线程
    在 Java 中,可以使用线程池来启动多线程。以下是使用线程池启动多线程的示例代码:首先,需要导入 `java.util.concu...
    99+
    2023-09-15
    java
  • Spring多线程的使用以及问题详解
    目录前言为什么使用多线程Springboot中是否对多线程方法进行了封装如何控制线程运行中的各项参数corePoolSize:核心线程数maximumPoolSize:最大线程数ke...
    99+
    2024-04-02
  • go语言多线程怎么使用
    在Go语言中,可以使用goroutine来实现多线程的功能。goroutine是Go语言中的轻量级线程,它可以在一个程序中同时执行多...
    99+
    2023-08-31
    go语言
  • Java多线程之锁怎么使用
    本篇内容介绍了“Java多线程之锁怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先强调一点:Java多线程的锁都是基于对象的,Ja...
    99+
    2023-07-05
  • c语言怎么使用多线程
    什么是多线程?多线程是一种并发编程技术,允许程序同时执行多个任务或线程。c 语言使用 posix 线程库创建和管理线程,步骤如下:创建线程加入线程线程函数同步(使用互斥锁、条件变量和信号...
    99+
    2024-05-21
    c语言 并发访问 同步机制
  • 怎么使用PHP实现多线程编程
    这篇文章主要介绍怎么使用PHP实现多线程编程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!多线程线程首先说下线程:线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位...
    99+
    2023-06-15
  • 反对使用Spring封装的多线程类原因
    目录1.Spring的异步代码2.是SpringBoot救了你3.End前言: 工作总难免会遇到被故障所驱使,其实是开启了线程池的暴力使用模式 我有必要简单的复述一下。其主要原因,就...
    99+
    2024-04-02
  • 怎么在python多线程中使用join
    怎么在python多线程中使用join?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、...
    99+
    2023-06-14
  • C#异步多线程ThreadPool怎么使用
    这篇文章主要讲解了“C#异步多线程ThreadPool怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异步多线程ThreadPool怎么使用”吧!启动线程池线程ThreadPool...
    99+
    2023-06-25
  • Java多线程并发ReentrantLock怎么使用
    这篇文章主要介绍“Java多线程并发ReentrantLock怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java多线程并发ReentrantLock怎么使用”文章能帮助大家解决问题。背景...
    99+
    2023-07-02
  • Java多线程并发AbstractQueuedSynchronizer怎么使用
    这篇文章主要介绍“Java多线程并发AbstractQueuedSynchronizer怎么使用”,在日常操作中,相信很多人在Java多线程并发AbstractQueuedSynchronizer怎么使用问题上存在疑惑,小编查阅了各式资料,...
    99+
    2023-07-02
  • Ruby3多线程并行Ractor怎么使用
    这篇文章主要介绍了Ruby3多线程并行Ractor怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Ruby3多线程并行Ractor怎么使用文章都会有所收获,下面我们一起来看看吧。在Ruby3之前,使用Th...
    99+
    2023-06-30
  • winform多线程组件BackgroundWorker怎么使用
    这篇文章主要介绍了winform多线程组件BackgroundWorker怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇winform多线程组件BackgroundWorker怎么使用文章都会有所收获,...
    99+
    2023-06-30
  • java多线程join方法怎么使用
    在Java中,join()方法是Thread类的一个方法,用于等待该线程完成执行。当在一个线程中调用另一个线程的join()方法时,当前线程会被阻塞,直到被调用的线程执行完毕。join()方法有两种使用方式:1. join():调用该方...
    99+
    2023-08-11
    java join
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作