Androidスレッドプールの使用


[waylen 505]Androidスレッドプールの使用
Threadのスレッドプールの使用
まず、スレッドプールを使用する理由を聞く人がいます.まず、runメソッドでは、スレッドが回収できず、統一的に管理できず、回収が行われず、システムがますますカートンし、深刻なダウンタイムoomになる結果を見てみましょう.スレッドプールを使用するメリットは何ですか.スレッドプールのリソースを再利用できます.重複作成を減らす.メモリリソースの使用を削減します.最大同時スレッド数を効果的に制御し、システムリソースの使用率を高めると同時に、過剰なリソース競争を回避し、渋滞を回避することができます.タイミング実行、定期実行、単一スレッド、同時数制御などの機能を提供します.
new Thread(){
            @Override
            public void run() {
                super.run();
            }
        };

Javaにはスレッドプール管理用のクラスExecutorsがカプセル化されています
JavaはExecutorsを通じて4種類のスレッドプールを提供し、それぞれ:
newCachedThreadPool
  • リストの内容newCachedThreadPoolはキャッシュ可能なスレッドプールを作成し、スレッドプールの長さが処理の必要を超えた場合、空きスレッドを柔軟に回収することができ、回収可能でない場合、新しいスレッドを作成します.
  •  ExecutorService pool = Executors.newCachedThreadPool(2); 
      //     Runnable    ,Thread        Runnable   
      Thread t1 = new MyThread(); 
      Thread t2 = new MyThread(); 
      Thread t3 = new MyThread(); 
      //            
      pool.execute(t1); 
      pool.execute(t2); 
      pool.execute(t3); 

    newFixedThreadPool
  • newFixedThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.
  • ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
    for (int i = 0; i < 10; i++) {
        final int index = i;
        fixedThreadPool.execute(new Runnable() {
    
            @Override
            public void run() {
                try {
                    System.out.println(index);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

    スレッドプールのサイズが3で、タスクごとにindexを出力した後sleepは2秒なので、2秒ごとに3つの数字を印刷します.定長スレッドプールのサイズは、システムリソースに基づいて設定することが望ましい.Runtime.getRuntime().availableProcessors().PreloadDataCacheを参照してください.
    newScheduledThreadPool
  • newScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.
  • ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    scheduledThreadPool.schedule(new Runnable() {
    
        @Override
        public void run() {
        //do something
        }
    }, 2, TimeUnit.SECONDS);

    2秒遅れて実行することを示します.
    定期的に実行するサンプルコードは次のとおりです.
    scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
    
        @Override
        public void run() {
            //do something
        }
    }, 1, 2, TimeUnit.SECONDS);

    1秒遅れて2秒ごとに実行されることを示します.
    newSingleThreadExecutor
  • newSingleThreadExecutorは、指定された順序(FIFO、LIFO、優先度)ですべてのタスクが実行されるように、一意の作業スレッドでのみタスクを実行する単一スレッド化されたスレッドプールを作成します.サンプルコードは次のとおりです:
  • ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 10; i++) {
        final int index = i;
        singleThreadExecutor.execute(new Runnable() {
    
            @Override
            public void run() {
                try {
                    System.out.println(index);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

    結果は順次出力され,各タスクを順次実行することに相当する.現行のGUIプログラムの多くは単一スレッドです.Androidの単一スレッドは、データベース操作、ファイル操作、アプリケーションの一括インストール、アプリケーションの一括削除など、同時実行には適していませんが、IOブロック性やUIスレッドの応答に影響を与える操作に使用できます.