JAvaベース-スレッドベースの概念

5414 ワード

オペレーティングシステムのスレッド
  • スレッドはプログラム実行の最小単位であり、プロセスはオペレーティングシステムがリソースを割り当てる最小単位である.
  • プロセスは、プロセス内のコードの異なる実行ルートである1つ以上のスレッドから構成されます.
  • プロセス間は互いに独立しているが、同じプロセスの下の各スレッド間でプログラムのメモリ空間(コードセグメント、データセット、スタックなどを含む)と、ファイルと信号を開くなどのプロセスレベルのリソースを共有し、あるプロセス内のスレッドは他のプロセスでは見えない.

  • JAvaでのスレッド
    Javaはマルチスレッドプログラミングに内蔵のサポートを提供し、2つのスレッド作成方法を提供した:1.Runableインタフェースを実現することによって;2.Threadクラスを継承します.Threadソースコードを確認すると、それ自体がRunnalbeインタフェースを実装しているため、Runnableはスレッドの作成に必要なインタフェースであることがわかります.

    class ThreadTest extends Thread{
    public ThreadB(String name) {
    super(name);
    }
       @Override
       public void run() {
            System.out.println(Thread.currentThread().getName());
       }
    

    }
    スレッドが するときはThreadを する があります.start()は、JNI(javaローカルメソッド)を び して の のスレッドを し、jvmが り てたThreadオブジェクトはスレッドに するハウジングにすぎません.Runnableは、パラメータとしてThreadに されたときにtarget に される「タスク」と なすことができ、Threadのデフォルトrunメソッドはこのtargetのrunメソッドを び して し、そうでなければサブクラスによってrunメソッドを する.このように,Runnableタスクとスレッドは であり, Threadは のRunnalbeタスクを しようと みることができる.
    スレッドのステータス
    NEW
    スレッドがstartメソッドを していないことを すとともに、startメソッドを び してもステータスがすぐに されるわけではないことに し、 プロセスが なステップもあります.
    RUNNABLE
    NEW のスレッド startが するとRUNNALBE となり、この はCPUのスレッドを して しようとしていると され、java のレベルのRUNNABLE は ずしも であるとは らない( には と ちの2つの にマッピングできる)
    BLOCKED
    ブロックまたは は、 、1つの「ロック」を つか、synchronizedがちょうど1つのスレッドを しているため、 のスレッドがアクセスしようとすると され、スレッドが を き わるかwaitメソッドを び してロックを するまで、 に る を うことができます.ロックを いでからBLOCKED からRUNNALBE に するBLOCKED はsynchronized に するだけでなく、サードパーティコンポーネントなどのinterruptメソッドでは を び ますことができない があります
    WAITING
    ステータス とは、 、スレッドがオブジェクトロックを って するコード に った 、 するオブジェクトを び すwaitメソッドの を します.waitの は に ることであり、 はいくつかのビジネスロジックを してwaitを する. できる :
  • notifyおよびnotifyAllメソッドは、 するwaitメソッドをRUNNABLE
  • に することができる.
  • wait(int timeout)がこの を える スレッドはこのとき(TIMED_WAITING )
  • と .
  • このスレッドに してinterruptメソッド
  • を いる
    TERMINATED
    runメソッドの が すると、javaレベルでは、osが スレッドをログアウトするか、 のリクエストwaitおよびnotifyメソッドに するためにsynchronizedを する があります.まず、この2つのメソッドはオブジェクトの に づいて され、1つのオブジェクトから される interruptがWAITINGおよびTIME_のみに して します.WAITING
    JAvaスレッドの な
    join
    シーンの1つの きなタスクを して の さなタスクに し、 の さなタスクを のスレッドで させ、 にデータがすべてのタスクの を つとjoinを できます.
    Waits for this thread to die.jdkはこの を し、リロード join(long millis)はms スレッドの ソースコードを で つ.join はまずこのスレッドが されることを し、ソースコードにはwait が されているため、 スレッドのロックを る があり、 することができる.
    interupt
    Java り みメカニズムは, り みによって のスレッドを することはできず, り まれたスレッドが で り みを する があるというコラボレーションメカニズムである.Java り みモデルも で、 スレッドオブジェクトにはbooleanタイプのIDが り み があるかどうかを しています. に、ブロック なメソッド にInterruptedExceptionが げ された 、BlockingQueue#put、BlockingQueue#take、Object#wait、Thread#sleepなどのメソッドが であることを し、 は の りである.
  • り み なブロッキングメソッドがInterruptedExceptionを する 、メソッド び しスタックの レイヤにこの を し けることができ、 り みが された 、 り み をクリアしてInterruptedExceptionを することができ、 のメソッドも り み なメソッドとなる.
  • するインタフェースのメソッド にthrows InterruptedExceptionがない など、メソッド でInterruptedExceptionを げ すのが な があります.この 、 なメソッドのInterruptedExceptionをキャプチャし、Thread.currentThread.interrupt()を して、 り み を します. り み が され、クリアされた も です. なコードでは, に クラスライブラリとして り みを み むべきではない.すなわち,InterruptedExceptionをキャプチャしてcatchで もせず, り み をクリアした に り み をリセットせず,InterruptedExceptionなどを げ さない. り み を み むと、メソッド び しスタックの にこれらの が られないためです.

  • スレッドがObjectクラスのwait()、wait(long)、wait(long、int)メソッドを び すか、クラスのjoin()、join(long)、join(long、int)、sleep(long)、sleep(long、int)メソッドを び す でブロックされると、その り み は され、InterruptedException も されます.スレッドが り み なチャネル のI/O でブロックされている 、チャネルは じられ、スレッドの り み が され、 の でのスレッドが されても がないとマークされているC l o s edByInterruptExceptionが されます.
    sleep
    sleep()は のスレッドを ( のスレッドをブロック)にし、CUPの を り、 のスレッドが にそのプロセスで たCPU を しないようにし、 のスレッドに する を すことを とする.sleep()はThreadクラスのStatic( )の である.したがって、オブジェクトのロックを することはできないので、1つのSynchronizedブロックでSleep()メソッドを び すと、スレッドはスリープしていますが、オブジェクトのロック が され、 のスレッドはこのオブジェクトにアクセスできません( ていてもオブジェクトロックを っています).
    synchronized
    synchronizedは、コードではなくカッコ のオブジェクトをロックします.static のsynchronizedメソッドでは、ロックされているのはオブジェクト 、つまりthisです.synchronizedキーワードの 、コードセグメントの を できるだけ し、コードセグメントに を けることができるなら、メソッド に を けないでください.これは、ロックの を さくし、コードをより きく することと ばれます.
    synchronized(this)の は、スレッドが するオブジェクトをロックすることを し、synchronized(Sync.class)は、スレッドが のSyncのオブジェクトであっても、 クラスをロックしてグローバルロックを することを すことができる.static synchronizedメソッド、staticメソッドは クラス にメソッド を けて び すことができ、メソッドではthisを できないため、ロックされているのはthisではなくクラスのClassオブジェクトであり、static synchronizedメソッドもグローバルロックに します.
    synchronizedリファレンスドキュメントの
    yield
  • Yieldは
  • である.
  • Yieldは、 のスレッドに、スレッドプール の じ を つスレッド
  • に を すように える.
  • Yieldは、 のスレッドを な に に することを するものではない-1つのスレッドを から に させることができ、 またはブロック ではない-yield()を するすべてのスレッドが に った 、すぐに
  • を する がある.
    yield()の は, じ のスレッド で に して できるようにすることである.しかし、 にはyield()が の を することは できない. したスレッドがスレッドスケジューラによって される があるからである.yield()スレッドが /スリープ/ブロック に したことはありません
    suspend、resume、stop suspend/resume
    wait/notifyメソッドに して、まずsuspend び し もスレッドはRUNNABLE でロックを せず、resumeが したときにのみ するとともに、suspend/resumeはsynchronizedのサポートstop び しを とせず、スレッドがRUNNING であっても し、Errorを げ すことでビジネスロジックエラーを き、データ の が される.wait/notifyリファレンスドキュメントの
    リファレンスドキュメント
    http://blog.csdn.net/luoweifu/article/details/46595285