同時サマリー

3783 ワード

前言
もしあなたが私と同じように、1、2年の順序でプログラミングを書いたら、プログラムの中のすべてのものはいつでも1つのステップしか実行できないので、同時高度な技術を学ぶことを考えるべきです.
同時は難しくて、同時プログラミングに精通する学習の難易度は基本的にオブジェクト向けのプログラミングに精通するのとあまり差がなくて、私自身も1つの学習段階にあるので、もしあなたがこのブログを見たら間違いが少なくないかもしれませんが、関係なく、学習自体は未知に向かって、暗闇の中で探求します.
同時性とは
JAVAの利用者であれば、Runnableインタフェースを複写することで、Thread構築方法で新しいRunnableオブジェクトを作成し、start方法でスレッドを有効にすることができ、マルチスレッドプログラミングとして簡単に理解できることを知っています.オペレーティングシステムがプロセス、スレッドの概念を熟知していることを学んだことがあるなら、同時性をよく知っていると思います.しかし、私たちは日常のプログラミングで同時使用することはめったにありません.それは難しいからです.なぜ私はそれが難しいのかを強調し続け、本質的には「論証可能な確定性を持っているが、実際には不確実性を持っている」と併発している.この言葉は回りくどいのではないでしょうか.実は私もよく分かりません.
なぜ私たちは同時学習をしなければならないのか.
客観的な原因は1つあります:同時スレッドを通じてプログラムの実行を極めて高めることができて、簡単に言えばもっと多くのコンピュータの性能を搾取することができます.現在のモールの法則は多少時代遅れであり、速度の向上は速度の速いチップの形ではなくマルチコアcpuの形で現れることが多い(はい、日常シーンに現れるクアッドコア8コア携帯電話).
  • 単一プロセッサで実行されるプログラムのパフォーマンスを向上させるという話は、単一プロセッサで同時に実行される実行オーバーヘッドが、コンテキスト切替という代価を増加させるため、すべてのプログラムで順次実行されるオーバーヘッドよりも確かに大きいため、直感に反するように聞こえます.問題の核心は「渋滞」であり、プログラミング中にI/Oと操作することは避けられない.ネットワーク要求操作により、外部条件が変わるまでプログラム全体が停止する.同時作成プログラムを使用する場合、プログラムの1つがブロックされている場合、プログラム内の他のプログラムは続行することもできます.シングルコアプロセッサから言えば,タスクブロックがなければ,シングルコアcpuではいわゆる同時プログラミングはない.
  • イベント駆動のプログラミングは、スムーズな応答性インタフェースを有するユーザインタフェースを記述したいと考えており、同時に少なくはない.このようなシナリオを考えると,プログラムが長期にわたって実行される操作のため,ユーザ入力が無視され,応答不可能なプログラムと呼ばれる.同時処理を使用しない場合、応答可能なユーザインタフェースを生成する唯一の方法は、すべてのタスクがユーザ入力を周期的にチェックすることである.ユーザの入力に単独で作成した実行スレッドで応答すると,このスレッドがほとんどの時間にブロックされていても,プログラムはある程度応答性を有する.

  • 基本的なスレッドメカニズム
    同時プログラミングにより、プログラムを複数の分離に分けることができます.独立して実行されるタスク.マルチスレッドメカニズムを使用すると、これらの独立したタスクの各々は、実行スレッドによって駆動されます.1つのスレッドは、プロセス内で単一の順序でストリームを制御します.単一のプロセスは複数の同時実行タスクを持つことができますが、あなたのプログラムは各タスクに独自のCPUがあるようにします.
  • Runnableインタフェース
    public class LiftOff implements Runnable {
        protected int countDown = 10;
    
        private static int taskCount = 0;
    
        private final int id = taskCount++;
    
        public LiftOff() {
    
        }
    
        public LiftOff(int countDown) {
            this.countDown = countDown;
        }
    
        @Override
        public void run() {
            while (countDown-- > 0) {
                System.out.println(status());
                Thread.yield();
            }
        }
    
        public String status() {
            return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff") + ").";
        }
    
    }
    
    タスクのrunメソッドは、通常、必要でないまでタスクを実行するために何らかの形式のループとして書かれています.通常run法は無限ループの形式で書かれている.通常、スレッドを中断してタスクを終了します.
  • ThreadクラスThreadクラスは、メソッドを構築するためにRunnableオブジェクトを必要とし、Threadクラスのstartメソッドを呼び出して必要な初期化操作を実行し、Runnableのrunメソッドを呼び出す.
  • Executorを使用してjava 1.5後にjava,utilが導入する.concurrentパッケージのエフェクタはThreadオブジェクトを引き継ぐために同時プログラミングを簡略化し、Executorは非同期タスクの実行を管理することを許可し、ExecutorServiceは適切なコンテキストを構築してRunnableオブジェクトを実行する方法を知っている.
  • newCacheThreadPoolはキャッシュ可能スレッドプールを作成し、スレッドプールの長さが処理の必要を超えた場合、空きスレッドを柔軟に回収し、回収可能でない場合は新しいスレッドを作成します.
  • newFixThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.
  • newSingleThreadExecutorは、指定された順序(FIFO、LIFO、優先度)ですべてのタスクが実行されるように、一意の作業スレッドでのみタスクを実行する単一スレッド化されたスレッドプールを作成します.
  • newScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.

  • Callable Runnableは、動作を実行する独立したタスクであるが、値は一切返されず、タスクの完了が値を返すことを望む場合、RunnableインタフェースではなくCallableインタフェースを実現することができ、そのタイプパラメータはメソッドcall()から、ExecutorServicesを使用することを示す.submit()メソッドが呼び出します.submitメソッドは、結果の特定のタイプをCallableで返すFutureオブジェクトを生成します.
  • バックグラウンドスレッドバックグラウンドスレッドとは、プログラムが実行されるときにバックグラウンドで汎用サービスを提供するスレッドであり、プログラムが不可欠または欠けていない部分ではない.したがって,すべての非バックグラウンドスレッドが終了すると,プログラムも終了し,プロセスのすべてのバックグラウンドプログラムを殺す.バックグラウンドスレッドに設定するには、スレッドが起動する前にsetDaemon()メソッドを呼び出す必要があります.
  • 基本的なまとめは、私が接触し始めたとき、実行するタスクとそれを動かすスレッドが異なることに疑問を抱いていました.Threadクラス自体は何も実行せず、与えられたタスクを駆動するだけです.実は私たちはThreadクラスに対して何の制御もありません.あなたはタスクを作成するしかありません.何らかの方法で1つのスレッドをタスクにアタッチすることで、このスレッドがタスクを駆動することができます.