android实现高性能,高并发,可延时线程池管理

摘要:
Android实现了高性能、高并发和延迟线程池管理为什么要使用线程池?

android实现高性能,高并发,可延时线程池管理

为什么要使用线程池?

 1.)new Thread()的缺点
  • 每次new Thread()耗费性能
  • 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
  • 不利于扩展,比如如定时执行、定期执行、线程中断
    2.)采用线程池的优点
  • 重用存在的线程,减少对象创建、消亡的开销,性能佳
  • 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
  • 提供定时执行、定期执行、单线程、并发数控制等功能

线程池实现:

1.实现思路:

   使用生产者消费者模式进行设计:通过应用层给线程池提供 线程队列(生产者),线程池执行线程队列(消费者)

  由线程池设定最大线程数,当在排队的线程数超过线程池最大数量,线程池会拒绝执行,被拒绝执行的线程将被从新

  放入线程队列进行排队

   生产者:线程队列(阻塞队列)

   消费者:线程池

   拒绝机制:当排队的线程进入线程池被拒绝后,重新放入队列,重新排队

   设计思路

android实现高性能,高并发,可延时线程池管理第1张

具体代码实现:

   ThreadPoolManager:


public class ThreadPoolManager {
    private static  ThreadPoolManager instance=new ThreadPoolManager();

    public static ThreadPoolManager getInstance() {
        return instance;
    }

    private ThreadPoolExecutor threadPoolExecutor;
    private LinkedBlockingQueue<Future<?>> service=new LinkedBlockingQueue<>();

    private ThreadPoolManager(){
        threadPoolExecutor=new ThreadPoolExecutor(4,10,10, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(4),handler);
        threadPoolExecutor.execute(runnable);
    }

    private Runnable runnable=new Runnable() {
        @Override
        public void run() {

            while (true) {
              
                FutureTask futureTask = null;

                try {
                    Log.e("myThreadPook","service size "+service.size());
                    futureTask = (FutureTask) service.take();
                    Log.e("myThreadPook","池  "+threadPoolExecutor.getPoolSize());

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            
                if (futureTask != null) {
                    threadPoolExecutor.execute(futureTask);
                }
            }
        }
    };

    public <T> void  execute(final FutureTask<T> futureTask, Object delayed){


        if(futureTask!=null){
            try {
                
                if(delayed!=null){
                    Timer timer=new Timer();
                    timer.schedule(new TimerTask(){
                        public void run(){
                            try {
                                service.put(futureTask);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }},(long)delayed);
                }else {
                    service.put(futureTask);

                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }


    private RejectedExecutionHandler handler=new RejectedExecutionHandler() {
        @Override
        public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) {
            try {
                service.put(new FutureTask<Object>(runnable,null));//
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

}

应用层调用:

MainActivity:


public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        for (int i=0;i<100;i++){//高并发
            final int finalI = i;
            Thread thread =new Thread(){
                @Override
                public void run() {
                    super.run();
//                    Log.e("jjjjjj", "runnable---->"+ finalI);
                }
            };
            ThreadPoolManager.getInstance().execute(new FutureTask<Object>(thread,null),null);
        }


                Thread thread =new Thread(){
                    @Override
                    public void run() {
                        super.run();
                    Log.e("jjjjjj", "runnable---->finalIrunnable");
                    }
                };
                ThreadPoolManager.getInstance().execute(new FutureTask<Object>(thread,null),(long)10000);//延时执行

    }
}

免责声明:文章转载自《android实现高性能,高并发,可延时线程池管理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MAC OSX 驱动操作Qt中gb2312/GBK的URL编解码函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Go并发

  进程、线程、协程     进程:进程是操作系统资源分配的最小单位       进程有自己的虚拟地址空间,这个空间包括了各种资源,例如堆、栈,各种段,它们其实都是虚拟地址空间的一块区域。所以说进程是资源分配的最小单位。     线程:线程是操作系统任务调度和执行的最小单位。       线程包含在进程之中,是进程中实际运作单位     协程:线程中协作式...

C#中的多线程

原文:http://www.albahari.com/threading/part2.aspx 文章来源:http://blog.gkarch.com/threading/part2.html 1同步概要 在第 1 部分:基础知识中,我们描述了如何在线程上启动任务、配置线程以及双向传递数据。同时也说明了局部变量对于线程来说是私有的,以及引用是如何在线程之间...

在Qt中使用sleep

  关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。sleep函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我们...

物联网Coap框架 ------- Californium结构分析

  一.Calinfornium简介 Californium 是一款基于Java实现的Coap技术框架,该项目实现了Coap协议的各种请求响应定义,支持CON/NON不同的可靠性传输模。 在同等的Coap协议的技术实现中,Calinfornium框架在众多框架中以性能最优。如下:   二.Californium的项目结构 目前Californium...

在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

在主线程中慎用WaitForSingleObject (WaitForMultipleObjects) 下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?线程函数: DWORD WINAPI ThreadProc(    while(!bTerminate)    {        // 从一个链表中读取信息并且插入到CListCtrl中...

【Java并发基础】死锁

前言 我们使用加锁机制来保证线程安全,但是如果过度地使用加锁,则可能会导致死锁。下面将介绍关于死锁的相关知识以及我们在编写程序时如何预防死锁。 什么是死锁 学习操作系统时,给出死锁的定义为两个或两个以上的线程在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。简化一点说就是:一组相互竞争资源的线程因为互相等待,导致“永久”...