android實現高性能,高並發,可延時線程池管理


android實現高性能,高並發,可延時線程池管理

 

為什么要使用線程池?

 1.)new Thread()的缺點
  • 每次new Thread()耗費性能
  • 調用new Thread()創建的線程缺乏管理,被稱為野線程,而且可以無限制創建,之間相互競爭,會導致過多占用系統資源導致系統癱瘓。
  • 不利於擴展,比如如定時執行、定期執行、線程中斷
    2.)采用線程池的優點
  • 重用存在的線程,減少對象創建、消亡的開銷,性能佳
  • 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞
  • 提供定時執行、定期執行、單線程、並發數控制等功能

 

線程池實現:

 

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);//延時執行

    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM