Android上实现高并发,可延迟处理

article/2025/9/25 15:49:44

目录

 

1.Thread和线程池优缺点对比

1.1使用Thread

1.2使用线程池

2.实现Android高并发,可延迟处理的解决方案

2.1为什么不推荐无限制创建Thread执行

2.2实现多线程并发处理解决方案

2.3具体实现如下:

2.4模拟测试多线程并发及延迟执行


1.Thread和线程池优缺点对比

1.1使用Thread

1)每次new Thread新建对象性能差;
2)线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom;
3)缺乏更多功能,如定时执行、定期执行、线程中断;

1.2使用线程池

相比new Thread,Java提供的四种线程池的好处在于:
1)重用存在的线程,减少对象创建、消亡的开销,性能佳;
2)可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞;
3)提供定时执行、定期执行、单线程、并发数控制等功能;

2.实现Android高并发,可延迟处理的解决方案

2.1为什么不推荐无限制创建Thread执行

CPU之所以要增加线程数,是源于多任务处理的需要。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。 因此,线程数是一种逻辑的概念,简单地说,就是模拟出的 CPU 核心数。一个核心最少对应一个线程,但英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥 CPU 性能,即一个核心可以有两个到多个线程。

2.2实现多线程并发处理解决方案

可以采用生产者,消费者的模式,生产者指需要具体执行的线程,消费者负责执行线程,将线程可以有序执行,防止线程无限制执行占用过多的资源;

以下是生产消费者队列:

生产者:将具体要执行的线程放入消息队列;

消费者:线程池负责执行将从队列中线程执行;

拒绝机制:若发现线程池已满,则执行拒绝机制,将线程放入消息队列等待,等待线程池空闲继续执行;

2.3具体实现如下:

package com.github.baby.owspace.view;import android.util.Log;import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 线程队列管理*/
public class ThreadPoolManager {private static final String TAG = ThreadPoolManager.class.getSimpleName();private static ThreadPoolManager instance = new ThreadPoolManager();public static ThreadPoolManager getInstance(){return instance;}/*** 线程池*/private ThreadPoolExecutor threadPoolExecutor;/*** 请求队列*/private LinkedBlockingDeque<Future<?>> service = new LinkedBlockingDeque<>();//线程池拒绝执行以后,放入阻塞队列private RejectedExecutionHandler handler = new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {try {service.put(new FutureTask<Object>(r, null));} catch (InterruptedException e) {e.printStackTrace();}}};/*** 初始化*/private ThreadPoolManager(){threadPoolExecutor  = new ThreadPoolExecutor(4, 10,10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(4), handler);threadPoolExecutor.execute(runnable);}/*** 消费者,不断检测线程队列是否有线程需要执行*/private Runnable runnable = new Runnable() {@Overridepublic void run() {while (true){FutureTask futureTask = null;try {Log.e(TAG, "队列中等待数量:"+service.size());futureTask = (FutureTask)service.take();Log.e(TAG, "线程池中线程的数量:"+threadPoolExecutor.getPoolSize());} catch (InterruptedException e) {e.printStackTrace();}if(futureTask !=  null){//消费需要执行的线程threadPoolExecutor.execute(futureTask);}}}};/*** 执行线程任务,延时多少秒执行,相当于生产者,把需要执行的线程放入消息队列* @param futureTask* @param delayed* @param <T>*/public <T> void execute(final FutureTask<T> futureTask, Object delayed){if(futureTask != null){//延时执行if(delayed != null){Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {try {service.put(futureTask);} catch (InterruptedException e) {e.printStackTrace();}}}, (long)delayed);}else {//不需要延迟处理try {service.put(futureTask);} catch (InterruptedException e) {e.printStackTrace();}}}}}

1).创建线程池和阻塞队列;

2).创建线程的消费者,负责监听阻塞队列,执行新的线程;

3).需要执行线程的地方将线程加入到阻塞队列;

4)线程池的拒绝机制处理,重新加入到阻塞队列;

2.4模拟测试多线程并发及延迟执行

public void manyRunnableTest(){//高并发for(int i=0; i<100; i++){final int finalI = i;Thread thread  = new Thread(){@Overridepublic void run() {super.run();}};ThreadPoolManager.getInstance().execute(new FutureTask<Object>(thread, null), null);}//模拟延时处理Thread thread =new Thread(){@Overridepublic void run() {super.run();Log.e(MainActivity.class.getSimpleName(), "runnable---->finalIrunnable");}};ThreadPoolManager.getInstance().execute(new FutureTask<Object>(thread,null),(long)10000);//延时执行}

参考:

https://blog.csdn.net/kerryqpw/article/details/64129583

 


http://chatgpt.dhexx.cn/article/68ym3rqG.shtml

相关文章

01 Nginx的高并发处理

文章目录 Nginx的高并发处理1.为什么需要Nginx&#xff1f;2.Nginx概述2.1 Nginx介绍2.2 Nginx和apache的优缺点2.2.1 Nginx相对于apache的优点2.2.2 apache相对于Nginx的优点2.2.3 Tengine介绍 3. Nginx的下载与安装3.1 Nginx下载3.2 Nginx的源码安装3.2.1 安装前的准备工作3.…

浅谈 高并发 处理方案

愿打开此篇对你有所帮助。 文章目录 高性能开发十大必须掌握的核心技术I/O优化&#xff1a;零拷贝技术I/O优化&#xff1a;多路复用技术线程池技术无锁编程技术进程间通信技术 Scale-out&#xff08;横向拓展&#xff09;缓存异步高性能、高可用、高拓展 解决方案❇ 高性能的实…

分布式架构 高并发处理

分布式架构 高并发处理 高并发介绍 在同时或者极短时间内&#xff0c;有大量请求到达服务端&#xff0c;每个请求都需要服务端耗费资源进行处理&#xff0c;并做出相应反馈服务端比如同时开启进程数&#xff0c;能同时运行的线程数、网络连接数、CPU运算、I/O、内存都是有限&am…

iis高并发处理三

使用.NET开发的Web应用程序部署到IIS上后&#xff0c;当有大量用户并发访问&#xff0c;用户在访问的时候可能会出现页面打开慢或无法打开的情况&#xff0c;那么从服务器上的IIS上我们可以做以下调整&#xff0c;让应用支持10万级以内的并发访问。 1、调整IIS 应用程序池队列…

前端优化之高并发处理

大部分的高并发处理基本都是在后端处理&#xff0c;但是在部分特殊情况下&#xff0c;后端无法阻止用户行为&#xff0c;需要前端做配合。例如在抢购、秒杀等场景。 高并发是什么&#xff1f; 对此&#xff0c;我们首先需要简单的去了解一下&#xff0c;高并发是什么&#xff1…

机器学习中的核函数与核方法(是什么?为什么?怎么做?)

我们在学习机器学习的时候&#xff0c;总是会看到一个概念——核&#xff0c;然后看到一堆公式。但是为什么要核呢&#xff1f;核到底是啥玩意&#xff1f;云里雾里。接下来&#xff0c;我们将要把“核”这个东西的神秘面纱一点点揭开。 一、什么是“核函数” 我们都知道&…

【Kernel Method】Kernel Method核方法介绍

引言 核方法是20世纪90年代模式识别与机器学习领域兴起的一场技术性革命。其优势在于允许研究者在原始数据对应的高维空间使用线性方法来分析和解决问题&#xff0c;且能有效地规避“ 维数灾难”。在模式识别的特征抽取领域&#xff0c;核方法最具特色之处在于其虽等价于先将原…

通俗理解核方法(kernel function)

最近对核方法比较有兴趣&#xff0c;想了解一下&#xff0c;在网上查阅了很多资料&#xff0c;感觉说的很晦涩&#xff0c;没有理解&#xff0c;于是查看了李政轩老师的课程&#xff0c;对其有了一定程度上的理解&#xff0c;本博客目的为了记录&#xff0c;也为了加深理解。 …

电机选型及校核方法总结

序&#xff1a;原先最初是没打算写电机选型总结的&#xff0c;而是准备写一些关于数字信号处理相关的东西&#xff0c;但是我的一个朋友提醒了我。他说&#xff0c;现在网上关于数字信号处理的东西写的太多了&#xff0c;特别是基础的知识都写烂了&#xff0c;你再写也没人看&a…

核方法与核技巧

本文对核方法&#xff08;kernel method&#xff09;进行简要的介绍。 核方法的主要思想是基于这样一个假设&#xff1a;“在低维空间中不能线性分割的点集&#xff0c;通过转化为高维空间中的点集时&#xff0c;很有可能变为线性可分的” &#xff0c;例如下图 左图的两类数据…

机器学习中的核方法(Kernel Method)

说到机器学习中的核方法(Kernel Method),大部分人应该是在学习SVM的时候认识到它或者听说它。它的基本思想是说,普通的SVM分类超平面只能应对线性可分的情况,而对于线性不可分的情况我们则需要引入一个Kernel,这个Kernel可以把数据集从低维映射到高维,使得原来线性不可分…

支持向量机原理小结(3)——核方法和非线性支持向量机

前面两篇博客对线性支持向量机进行了详细的讲解&#xff0c;但线性SVM对于非线性的数据是无可奈何的。这篇博客将讲一下非线性支持向量机。 1. 核方法 对SVM有过一定耳闻的人&#xff0c;一定听说过“核技巧”、“核方法”这些名词&#xff0c;其实核方法并不是只能应用于SVM&…

核方法以及核函数讲解

核方法的主要思想是基于这样一个假设&#xff1a;“在低维空间中不能线性分割的点集&#xff0c;通过转化为高维空间中的点集时&#xff0c;很有可能变为线性可分的” &#xff0c;例如下图 左图的两类数据要想在一维空间上线性分开是不可能的&#xff0c;然而通过F(x)(x-a)(x-…

MLAPP————第十四章 核方法

第十四章 核方法 14.1 简介 到目前为止&#xff0c;我们书上提到的各种方法&#xff0c;包括分类&#xff0c;聚类或者是其它的一些处理手段&#xff0c;我们的特征都是固定大小的一个向量&#xff0c;一般具有如下的形式&#xff0c;。然而&#xff0c;对于某些类型的对象&a…

核方法的理解

核方法在非线性分类问题上有很好的解决思路&#xff0c;应用于学习器SVM以及降维KPCA上&#xff0c;当然二者路径也不同&#xff0c;SVM就是从低维不可分映射到高维可分&#xff0c;而KPCA是从低维不可分映射到高维后再降维到低维可分&#xff0c;但都脱离不来这个核方法。 核…

核方法原理

核方法原理 1.无力的线性分类器 一般情况下&#xff0c;我们考虑构造一个线性分类器来解决问题。但是实际中&#xff0c;线性分类器的效果达不到要求&#xff0c;因为大部分数据都不是线性可分的&#xff0c;如下面这幅图。一种改进的方法是把多个弱的线性分类器组合得到一个强…

核方法(kernel method)的主要思想

kernel method是针对低维线性不可分而提出的一种解决方法&#xff0c;在PRML中有一章节的介绍&#xff0c;对其理解&#xff0c;也是迭代更进的过程。 简单来说&#xff0c;kernel method是一种低维和高维特征空间映射的方法&#xff0c;利用低维内积的函数来表征高维内积&…

python svm核函数_Python.SVM(三)核方法

Python.SVM(三)核方法 1 什么是核方法 往简单里说&#xff0c;核方法是将一个低维的线性不可分的数据映射到一个高维的空间、并期望映射后的数据在高维空间里是线性可分的。 我们以异或数据集为例&#xff1a;在二维空间中、异或数据集是线性不可分的&#xff1b;但是通过将其映…

核方法回归

参考论文-DENSITY ESTIMATION FOR STATISTICS AND DATA ANALYSIS 给定数据集&#xff0c;来估计概率密度函数 Histograms The naive estimator 也是分成段的平行x轴直线连接起来 The kernel estimator 其中kernel可以是高斯核&#xff0c;结果图: 可以见到&#xff0c;高斯核…

【机器学习】SVM核方法

https://blog.csdn.net/qq_32742009/article/details/81430534 Kernel Trick 在 SVM 中引入核方法便可使得 SVM 变为非线性分类器&#xff0c;给定非线性可分数据集 &#xff0c;如下图所示&#xff0c;此时找不到一个分类平面来将数据分开&#xff0c;核方法可以将数据投影到…