JAVA同時処理経験(二)JAVAスレッド池運用と並行ツール

3523 ワード

はじめに
前の章は県城に対して、自分の理解をまとめたものです。カタログのみ
二、スレッド池
1:スレッド池は主にThreadpoolExetorがExectors工場で生成されます。
2)スレッドスレッドを生成するプールの分類:
newFIxedThread==============固定サイズのスレッドプールに戻ります。
newSingleThreadExector=====は、シングルスレッド処理に戻ります。
newCachedThreadPool=====を返します。
newSingleThreadScheduleExector==単一スレッド(サイクル実行)計画スレッド
newScheduleThreadPool=====指定スレッド数(有周期実行)
 1‘newScheduleThreadPool具体的な方法
 
1’1 sheduleAt FixedRate:固定周波数
                 1‘2 shedule Withfixed Dalay:相当周波数
3)スレッドにはキューと拒否戦略があります。
3’1 synchronousQue直接提出列
        3‘2 arrayBlokingQue’に境界列があります。
        3’LInkedBlokingQueワンランク
       3‘4 prrority BlockingQueuq優先順位行列
 4)断り策
4’1 abortPloicy戦略は直接異常であり、システムの正常な動作を阻止する。
        4‘2 CallerRunPolicyは資源を占領してゆっくり実行します。
        4’3 DiscrdOldedest Ploicyは最も古い戦略を捨てる。
        4‘4 DiscrdPolicyは黙って捨てて、プログラムは眠くないです。
5】ThreadPool Exectorがbefore afterなどの方法を提供する。
6:スレッドのスレッドは自分のスレッドで作成することができますが、標準で十分です。
7】Runtime.getRuntime().available Processorsテストシステム設定スレッド池の数
8】スレッド池でのexecuteとsubmitの違い。普通はsubmitで異常を取得します。
9】自分でスレッドを広げることが必要ならば【あなたのプログラムのエラーポイントを効果的に確認する】【submitを見るfuterは十分です。】
10)JDK 7以降の新しいFrom/Joinスレッド池のコードは以下の通りです。
package jDKMulit;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 * Created by ycy on 16/1/13.
 */
public class CountTaskForkJoin extends RecursiveTask<Long> {
    private static final int THEESHOLD = 10000;
    private long start;
    private long end;

    public CountTaskForkJoin(long start, long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public Long compute() {
        long sum = 0;
        boolean canCpmpute = (end - start) < THEESHOLD;
        if (canCpmpute) {
            for (long i = start; i <= end; i++) {
                sum += i;
            }
        } else {
            //  100    
            long step = (start + end) / 100;
            ArrayList<CountTaskForkJoin> subTasks = new ArrayList<CountTaskForkJoin>();
            long pos = start;
            for (int i = 0; i < 100; i++) {
                long lastOne = pos + step;
                if (lastOne > end) lastOne = end;
                CountTaskForkJoin subTask = new CountTaskForkJoin(pos, lastOne);
                pos += step + 1;
                subTasks.add(subTask);
                subTask.fork();

            }
            for (CountTaskForkJoin t : subTasks) {
                sum += t.join();
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        CountTaskForkJoin task = new CountTaskForkJoin(0, 200000l);
        ForkJoinTask<Long> rsult = forkJoinPool.submit(task);
        try {
            long res = rsult.get();
            System.out.println("sum=" + res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
11)JDK下の合併容器
11.1 Concerenthashmap:スレッドセキュリティhsamap
112.CopyOnwriteArayList:快速読み取りのlist
        11.3 Concurrent Link List:スレッド安全のLIkedList
        11.4 BlockingQue:スレッドブロックのデータキュー
        11.5 Conccurrent SkipListMap:ジャンプテーブル
11.6効率的な読み書き行列:ConcerentLinkkedQue