マルチスレッドとマルチプログラミング(1)


Multi Thread Programing


プロセスとスレッド


プロセス

  • プロセスとは、実行中のプログラムで、実行に必要なリソース(メモリ)がオペレーティングシステムに割り当てられ、プロセスとして使用されます.プログラムを実行するために必要なデータ、メモリなどのリソースとスレッドからなり、プロセス内のリソースを利用してタスクを実行するのがスレッドです.1つのプログラムは、複数のプロセスを作成することもできます.

  • プロセスは、プログラムとプロセス制御ブロックから構成されます.
    プロセスは、独立したメモリ領域を個別に割り当てます.

    山紅

  • スレッドは、プロセスにstack、共有コード、データ、heap領域
  • を個別に割り当てる.
  • スレッドは、1つのプロセス内で実行される複数の実行ストリームであり、プロセス内のアドレス空間またはhip空間などのリソース内でスレッド間で共有され、実行される.
  • 同じプロセス内の複数のスレッドはhip空間を共有する.

  • このとき、Java Threadは通常のThreadとほとんど変わらず、JVM(Java Virtual Machine)はオペレーティングシステムの役割を果たす.
    Javaにはプロセスは存在せず、スレッドのみであり、JavaスレッドはJVMスケジューリングの実行ユニットコードブロックである.

    マルチタスクとマルチスレッド


    マルチタスク処理とは、2つ以上のタスクを同時に処理することです.
    例えば、映画を見るときにチャットツール機能を併用したり、音楽を聴いたりしてネットサーフィンを行うことは並行して処理することができる.これは、例えば、メッセージングでファイルとチャットを交換する場合、マルチスレッド(Multi Thread)に起因する可能性があるプロセスでも起こり得る.上の図に示すように、各プロセスはオペレーティングシステム(OS)から割り当てられた固有のメモリを相互に侵害することはできないが、マルチスレッドは各スレッドにコード、データ、heapを配置して共有するので、プロセスは予期せぬ異常で終了する可能性があるので注意してください.

    start()とrun()


    スレッドを実行するとrun()ではなくstart()が呼び出されます.これはstart()とrun()の違いと実行プロセスを理解する必要がある.
    各スレッドは独立したタスクを実行するために独自の呼び出しスタックを必要とするため、新しいスレッドの作成と実行のたびに新しい呼び出しスタックが作成され、スレッドが終了すると、操作で使用される呼び出しスタックは消えます.

    1.mainメソッドでThreedのstart()を呼び出します.
    2.start()は、新しいスレッドを生成し、スレッドを処理するための呼び出しスタックを生成する.
    3.新しく生成された呼び出しスタックでrun()を呼び出し、スレッドの独立した空間で操作を実行します.
    4.現在、2つの呼び出しスタックがあり、スケジューラが指定した順序で順番に実行されます.
    class MyThread extends Thread {
         public void run() {
            throwException();
        }
         public void throwException() {
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
     public class Test {
        public static void main(String[] args) {
            MyThread my = new MyThread();
            my.start();
        }
    }
    
  • まずメインスレッドを実行し、
  • start()を実行すると、メインスレッドは終了時にMyThreadを生成します.
  • call stackにrun->throwException順に積み上げます.
  • すなわちstart()で新しいスレッドを作成し、main()ではなくrun()を実行します.
    start()ではなくrun()を直接実行すると、新しいスレッドを作成して起動するのではなくoverriding run()が呼び出されます.この場合、call Stackの最初のメソッドがmainとなり、mainでExceptionが生成されます.

    ねじ状態


    スレッドオブジェクトを作成しstart()メソッドを呼び出すと、スレッドはすぐに実行されるように見えますが、実際には実行待ちの状態になります.
    待機中のスレッドでは、スレッドスケジューリングとして選択されたスレッドがCPUを占有しrun()メソッドを実行する.
    この状態を「運転状態」と呼びます.実行状態のスレッドはrun()メソッドを実行する前に、スレッドスケジューリングによって実行待ち状態に戻ることができます.次に、実行待ち状態にある別のスレッドを選択し、実行状態にします.
    これにより,Threadは待機状態と運転状態を交互に実行し,独自のrun()メソッドを逐次実行する.実行状態でrun()メソッドを終了すると、実行するコードがないため、スレッドの実行は停止します.
    この状態を「終了状態」と呼ぶ.

    Threedのライフサイクル

  • Runnable(準備完了)
    -Threadを実行する準備をするには
    -
  • 状態、CPU占有なし、運転待ち
  • 運転(運転状態)
    -占用CPU運転
    -優先度が決定されると、JVMはrun()メソッドをrunningステータス
  • に自動的に呼び出す.
  • Dead(終了状態)
    -実行中にすべてのスレッドを実行した後の完了ステータス(Done)
  • Blocked(遅延状態)
    -CPU占有スペースが失われた場合、後続の方法を実行して実行可能状態に変換する
    -wait()メソッドロックスレッドnotify()メソッド呼び出し時にRunnable状態に入る
    -seep()メソッドでロックするスレッドは、指定された時間後に非稼働状態になる
  • .

    せいぎょねじじょうたい


    マルチスレッドプログラムを記述するためには,微細なスレッド状態制御が必要であり,状態制御が正しくないとプログラムが不安定になり,ハングアップする.マルチスレッドプログラミングが困難な原因はここにある.スレッドをうまく使用すると薬物になりますが、適切に使用しないと致命的なプログラムエラーが発生するため、スレッドを正しく制御する方法を熟知する必要があります.
    スレッド制御をより良く行うためには,スレッド状態の変化を招く方法を把握する必要がある.次の図は、ステータスの変化を取得する方法のタイプを示しています.
  • スリープ()-所与の時間内に
  • を一時停止する
  • 歩留まり()-他のスレッドの実行に譲歩
  • join()-別のスレッドの終了を待つ
  • wait()、notify()およびnotifyAll()-ネジ間で連携
    -すべてのオブジェクトが持つ方法ではなく、オブジェクトが持つ方法です.
  • 注意:velog-wjdrbs 96
    注意:国
    注:組織コード工場