精华内容
下载资源
问答
  • 使用多线程处理耗时工作

    千次阅读 2013-04-29 18:24:13
    大家对多线程处理耗时工作的重要性应该早已认识到。本章的关键点是:把耗时的、与UI渲染无关的操作进行分割分配到多个线程中并发执行。    在本章,googler 全篇介绍了通过 java 线程池来构造多线程执行环境的...

    大家对多线程处理耗时工作的重要性应该早已认识到。本章的关键点是:把耗时的、与UI渲染无关的操作进行分割分配到多个线程中并发执行

     

           在本章,googler 全篇介绍了通过 java 线程池来构造多线程执行环境的详细流程,关键要点如下:

     

    1.   定义一个能在 Thread 中执行的 Runnable 子类 SubRunnable,把耗时的工作交给 SubRunnable 的 run() 方法;

     

    2.   在 run() 中通过 Thread.currentThread() 获取并保存SubRunnable 所在的线程以备中断所需;

     

    3.   初始化一个 BlockingQueue<Runnable> 队列的实例runQueue,用于排队缓冲等待执行的 SubRunnables;

     

    4.   初始化并配置一个 java 线程池 ThreadPoolExecutor的实例 threadpool,配置初始化可用线程数、最大可用线程数、线程关闭前的闲置时间、闲置时间单位、工作队列(即上述初始化的 runQueue);

     

    5.   threadpool 是 runQueue 的实际操纵者,负责将 SubRunnable 排队、按照FIFO策略给 SubRunnable 分配 Thread 并调度执行;

     

    6.   构造一个 Handler 的实例 mainHandler 用于接收 SubRunnable 执行的状态和结果,并更新UI,所以必须用主线程Looper 来初始化它:mainHandler= new Handler(Looper.getMainLooper()); 这样 mainHandler 将与 mian Looper 同处于主线程中,可以接收主线程的派发事件;

     

    7.   当需要提交新的任务执行时,调用 threadpool.execute(newRunnable); newRunnable 将被排队调度执行;

     

    8.   当 SubRunnable 需要报告执行状态和结果时,通过 mainHandler 传送给 UI 线程处理;

     

    9.   当 SubRunnable 执行完毕,确定不再需要它时,中断其所在线程,并将其从队列中移除:”the runnable’s thread”.interrupt(); threadpool.remove(“the runnable”);这点很重要,否则队列中的资源无法释放,严重时将抛出 RejectedExecutionHandler 异常。

     

    实际上这是一个android.os.AsyncTask 的手动实现流程,android.os.AsyncTask 正是对此流程的一种封装,只是不过手动实现的方案有更大的弹性,你可以灵活地配置 ThreadPoolExecutor 的参数和队列。

     

    如果大家有兴趣可以查看一下android.os.AsyncTask 的源代码:

     

    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/os/AsyncTask.java#AsyncTask

     

    下面通过图示简要总结一下以上流程:

     


     

    展开全文
  • RabbitMQ设置多线程处理消息

    万次阅读 2019-01-16 19:14:44
    使用@RabbitListener注解指定消费方法...可以配置mq的容器工厂参数,增加并发处理数量即可实现多线程处理监听队列,实现多线程处理消息。   1、在RabbitmqConfig.java中添加容器工厂配置: @Bean("custom...

    使用@RabbitListener注解指定消费方法,默认情况是单线程监听队列,可以观察当队列有多个任务时消费端每次只消费一个消息,单线程处理消息容易引起消息处理缓慢,消息堆积,不能最大利用硬件资源

    可以配置mq的容器工厂参数,增加并发处理数量即可实现多线程处理监听队列,实现多线程处理消息。

     

    1、在RabbitmqConfig.java中添加容器工厂配置:

     @Bean("customContainerFactory")
        public SimpleRabbitListenerContainerFactory containerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConcurrentConsumers(10);  //设置线程数
            factory.setMaxConcurrentConsumers(10); //最大线程数
            configurer.configure(factory, connectionFactory);
            return factory;
        }

     

    2、在@RabbitListener注解中指定容器工厂

    @RabbitListener(queues = {"监听队列名"},containerFactory = "customContainerFactory")

     

    再次测试当队列有多个任务时消费端的并发处理能力。

     

     

    展开全文
  • RabbitMQ设置多线程处理队列消息

    千次阅读 2019-05-17 19:08:32
    @RabbitListener注解指定消费方法,默认...可以配置mq的容器工厂参数,增加并发处理数量即可实现多线程处理监听队列,实现多线程处理消息。 1、RabbitmqConfig.java中添加容器工厂配置: @Bean("customContainerFac...

    @RabbitListener注解指定消费方法,默认是单线程监听队列,可以观察当队列有多个任务时消费端每次只消费一个消息,单线程处理消息容易引起消息处理缓慢,消息堆积,不能最大利用硬件资源

    可以配置mq的容器工厂参数,增加并发处理数量即可实现多线程处理监听队列,实现多线程处理消息。

    1、RabbitmqConfig.java中添加容器工厂配置:

     @Bean("customContainerFactory")
     public SimpleRabbitListenerContainerFactory containerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConcurrentConsumers(10);  //设置线程数
            factory.setMaxConcurrentConsumers(10); //最大线程数
            configurer.configure(factory, connectionFactory);
            return factory;
        }
    

    2、@RabbitListener注解指定容器工厂

    @RabbitListener(queues = {"监听队列名"},containerFactory = "customContainerFactory")
    

    再次测试当队列有多个任务时消费端的并发处理能力,可以在执行方法中打印日志,查看对应执行的请求是否为多线程请求!

    展开全文
  • 多线程异步任务处理

    千次阅读 2018-11-07 21:29:31
    文章目录多线程异步任务处理线程池线程池的优缺点常用的线程池技术@Async注解源码   我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,那我们怎么去使用它呢?我们先来了解下什么是...

    @(多线程&&并发)

    多线程异步任务处理

    欢迎关注作者博客
    简书传送门


      我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,那我们怎么去使用它呢?我们先来了解下什么是线程池?

    线程池

      线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务。

    线程池的优缺点

    使用线程池管理线程的优点

    • 线程的创建和销毁由线程池维护,一个线程在完成任务后并不会立即销毁,而是由后续的任务复用这个线程,从而减少线程的创建和销毁,节约系统的开销
    • 线程池旨在线程的复用,这就可以节约我们用以往的方式创建线程和销毁所消耗的时间,减少线程频繁调度的开销,从而节约系统资源,提高系统吞吐量
    • 在执行大量异步任务时提高了性能
    • Java内置的一套ExecutorService线程池相关的api,可以更方便的控制线程的最大并发数、线程的定时任务、单线程的顺序执行等
    常用的线程池技术
    • Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务。
    • Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。
    • Executors.newScheduledThreadPool(int n):创建一个定长线程池,支持定时及周期性任务执行。
    • Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

    @Async注解

      在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
      如何在Spring中启用@Async。基于Java配置的启用方式:

    @Configuration
    @EnableAsync
    public class ExecutorConfig {
    }
    

    源码

    配置类:

    /**
     * @program:
     * @description: 线程池配置类
     * @author: zhouzhixiang
     * @create: 2018-11-07 19:10
     */
    @Configuration
    @EnableAsync
    public class ExecutorConfig {
    
        @Bean
        public Executor asyncServiceExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            //配置核心线程数
            executor.setCorePoolSize(20);
            //配置最大线程数
            executor.setMaxPoolSize(20);
            //配置队列大小
            executor.setQueueCapacity(99999);
            //配置线程池中的线程的名称前缀
            executor.setThreadNamePrefix("async-service-");
            // rejection-policy:当pool已经达到max size的时候,如何处理新任务
            // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            //执行初始化
            executor.initialize();
            return executor;
        }
    }
    

    接口:

    /**
     * @program:
     * @description: 异步接口
     * @author: zhouzhixiang
     * @create: 2018-11-07 19:08
     */
    public interface AsyncService {
    
        public void testAsync();
    }
    

    实现类:

    /**
     * @program:
     * @description:
     * @author: zhouzhixiang
     * @create: 2018-11-07 19:08
     */
    @Service
    public class AsyncServiceImpl implements AsyncService {
    
        private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
    
        @Override
        @Async("asyncServiceExecutor")
        public void testAsync() {
            try{
                Thread.sleep(10000);
                logger.info("start executeAsync");
                System.out.println("测试异步任务!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.info("end executeAsync");
        }
    }
    

    controller:

        @ApiOperation(value = "business-测试", notes = "business-测试")
        @PostMapping("test")
        public ServiceResponse test2(@RequestBody JSONObject jsonObject, HttpServletRequest req){
            businessService.test();
            ServiceResponse response = new ServiceResponse();
            response.setCode(200);
            response.setData("成功");
            return response;
        }
    

    控制台输出:
    image.png

    image.png

    image.png

    由下图可以看出,异步任务执行成功。
    想提升编码能力吗,扫码购买提升逼格!
    在这里插入图片描述

    欢迎加入Java猿社区
    扫码_搜索联合传播样式-标准色版.png

    展开全文
  • 万字图解Java多线程

    万次阅读 多人点赞 2020-09-06 14:45:07
    java多线程我个人觉得是javaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,...
  • Java 处理多线程

    千次阅读 2017-09-05 17:49:37
    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。  这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也...
  • Python下的多线程处理

    千次阅读 2018-09-21 18:24:54
    ########多线程#########       ## 线程的概念与多线程的引入    一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,一个进程里面必然会有一个主线程,...
  • 微信小程序多线程处理机制worker

    万次阅读 2018-05-23 10:12:17
    具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。在小程序中也可能有线程并发执行的阶段,这时候worker可以处理小程序开发的多线程机制。微信小程序的一些异步处理任务...
  • 当利用多线程处理程序时,共有资源就是各个线程抢占的对象,处理加锁问题总结几点: 现象: 多线程抢占临界资源,会导致程序阻塞,影响效率如图: 经验和原因: 1. 能不加锁的地方,就不加锁,因为多线程...
  • 图像处理多线程计算

    千次阅读 2017-01-23 19:42:53
    利用CPU多线程处理能力可以大幅度加快计算速度。但是,为了保证多线程处理的结果和单线程处理的结果完全相同,图像的多线程计算有一些需要特别考虑的地方。 基本思路:为了能让多个线程同时并行处理,那么各自处理...
  • @程序员,别再迷恋多线程工作

    千次阅读 多人点赞 2019-12-16 11:00:07
    我刚刚尝试了一下,一边用 iPad...很长一段时间内,我都在欺骗我自己:一边写博客,一边听音乐,自认为可以一心多用,做到了像计算机一样的“多线程工作”。可等到音乐的某个高潮响起时,我情不自禁地投入到了音乐的...
  • 多线程是否能加快处理速度

    千次阅读 2017-12-20 20:47:42
    问:多线程是不是能加快处理速度? 解析: 在使用多线程时,一定要知道一个道理:处理速度的最终决定因素是CPU、内存等,在单CPU(无论多少核)上,分配CPU资源的单位是“进程”而不是“线程”。 我们可以...
  • js 多线程

    千次阅读 2017-09-22 13:42:45
    什么是多线程? 多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的的计算机因...在一个程序中,这些独立运行的程序片段叫作线程(Thread),利用它编程的概念就叫做”多线程处理
  • 正确处理kafka多线程消费的姿势

    万次阅读 多人点赞 2019-08-03 14:21:12
    通过kafka作为模块间的转换器,不仅有MQ的几大好处:异步、解耦、削峰等几大好处,而且开始考虑最大的好处,可以实现架构的水平扩展,下游系统出现性能瓶颈,容器平台伸缩增加一些实例消费能力很快就提上来了,整体...
  • QT多线程编程详解

    万次阅读 多人点赞 2019-04-24 22:08:20
    一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次...二、QT多线程简介 QT通过三种形式提供了对线程...
  • 同步多线程

    千次阅读 2013-11-02 08:50:57
    本质上,同步多线程是一种将线程级并行处理(多CPU)转化为指令级并行处理(同一CPU)的方法。 同步多线程是单个物理处理器从多个硬件线程上下文同时分派指令的能力。同步多线程用于在商用环境中及为周期/指令...
  • Java 多线程

    千次阅读 2012-05-19 21:48:12
    多线程 程序与进程 程序:一段静态的代码。 进程:程序的一次动态执行过程,它对应从代码加载、执行到执行完毕的一个完整过程。 线程是比进程更小的执行单位,它是在一个进程中独立的控制流,即程序内部的控制...
  • 多线程技术

    千次阅读 2016-11-07 15:29:41
    多任务、多线程和多处理这些术语经常被交替地使用,但是它们在本质上是不同的概念。多任务是指操作系统具有在任务间快速切换使得这些任务看起来是在同步执行的能力。在一个抢占式多任务系统中,应用程序可以随时被...
  • 线程、进程、多线程、多进程 和 多任务 小结

    千次阅读 多人点赞 2019-04-20 11:59:56
    4 多线程 5 线程与进程的关系 6 线程和进程的区别 7 进程的优缺点 7.1 进程的优点 7.2 进程的缺点 8 线程的优缺点 8.1 线程的优点 8.2 线程的缺点 9 多线程的优缺点 9.1 多线程的优点 9.2 多线程的缺点 ...
  • 编程思想之多线程与多进程(4)——C++中的多线程

    万次阅读 多人点赞 2015-07-10 21:48:18
    《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,《编程思想之多线程与多进程(2)——线程优先级与线程安全》一文讲了线程安全(各种同步锁)...
  • Java多线程(一)线程的基本概念

    万次阅读 2021-03-04 10:05:16
    在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” 。------以上摘自百度百科 一、生活中多线程的例子 城市发展: 乡村小道:可以理解为典型的单线程,当车流量...
  • Java多线程详解

    千次阅读 2016-04-12 20:55:01
    Java多线程详解         多线程简介 ...具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用
  • 阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇一个经典的多线程同步问题》《秒杀多线程第五篇经典线程同步关键段CS》《秒杀多线程第六篇经典线程同步事件Event》《秒杀多线程第七篇经典线程同步互斥量Mutex》...
  • iOS多线程及异步处理

    千次阅读 2017-03-16 14:29:03
    概览 大家都知道,在开发过程中应该尽...改变这种状况可以从两个角度出发:对于单核处理器,可以将个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于
  • Java多线程面试题

    万次阅读 2020-10-25 15:56:40
    sleep 方法: 是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话); wait 方法: 是 Object 的方法...
  • 编程思想之多线程与多进程(3)——Java中的多线程

    万次阅读 多人点赞 2015-06-28 20:49:35
    在程序需要同时执行多个任务时,可以采用多线程。Java给多线程编程提供了内置的支持,提供了两种创建线程方法:1.通过实现Runable接口;2.通过继承Thread类。 Thread是JDK实现的对线程支持的类,Thread类本身实现了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 293,066
精华内容 117,226
关键字:

多线程处理工作的能力