あなたは、マルチスレッドのJavaの詳細な理解を取るために5分

マルチスレッド

  • 従来のオペレーティングシステムでは、プログラムは、スタンドアロンのリソース割り当てとして独立して実行することはできませんし、基本的な単位は、プロセスです。OSで構成されていません
  • 別のプログラムの実行を許可する前に、実行されるプログラムでシステム、プログラムの実行順序の実装、すなわち、;環境をマルチプログラミングで同時に複数のプログラムを可能にします。これらの二つの実装プログラムの間で有意差があります。実行中Caozuojitongにおける処理の概念の導入の結果であった場合には、この機能は、プログラムによって複雑になります。
  • 基本単位はリソースと独立ランニングを持っているとして、1960年代以来、人々は前方処理の概念を入れ、OSが処理することが可能となっています。さらに、システムのスループットを向上させることができ、システム内のプログラムの同時実行性の程度を、改善するためにそれを使用しようとすると、スレッド(スレッド) - 1980年代半ばまでは、人々は独立して動作することができ、基本的な単位未満進歩を遂げ。特に、マルチプロセッサシステムの迅速な開発を1990年代に入ってから、スレッドが良く、並列プロセスよりも、プログラムの実装のレベルを向上させることができるマルチプロセッサの利点を十分に発揮する、近年では、Aを開始しましたOSのマルチプロセッサはまた、OSのパフォーマンスを向上させるためにスレッドを導入しています。
  • ----------------上記から取られている「コンピュータCaozuojitong - タング・ザイアオーダンは、バージョン3のEDS」

プロセスの概念

  • これは、プログラムを実行しています。これは、プログラムのロックによって占有メモリ領域を表す、です。

機能

  • 独立性:プロセスは独立したエンティティが存在するシステムであり、それは各プロセスは、独自のプライベートアドレス空間を持つ、独自の独立したリソースを持つことができます。自身が許可されていないプロセスの場合には、ユーザが直接、別のプロセスのプロセスアドレス空間にアクセスすることはできません。

  • ダイナミクス:プログラムは命令の単なる静的なセットであり、命令処理システムコレクションの継続的な活動であることプロセスおよび手順の間の差。時間の概念を追加するプロセスでは、プロセスは独自のライフサイクルとさまざまな状態を持っている、プログラム内のこれらの概念は使用できません。

  • 並行性:複数のプロセスは、複数のプロセスがお互いに影響を与えていない、単一のプロセッサ上で同時に実行することができます。


スレッドの概念

  • スレッド(スレッド)は、システムの運転スケジュールを操作することが可能な最小単位です。これは、プロセスの単位プロセスの実際の動作が含まれます。プロセスは複数のスレッドを開くことができます。

  • これは、同じプロセスが複数の同時タスクを処理できるように、マルチスレッド、マルチプロセスの概念を拡張します。

  • 要するに、少なくとも一つのプロセスを実行しているプログラムの後、プロセスは複数のスレッドが含まれています。

  • プロセスは一つだけスレッドを有する場合、このプログラムは、シングルスレッドとして知られています。

  • 実行パスの数の処理が呼び出される場合はプログラムをマルチスレッド。
    ここに画像を挿入説明


プロセスとスレッドとの間の関係
ここに画像を挿入説明
は、オペレーティング・システムは複数のプロセスを有することができることを見ることができる上記の画像からは、プロセスは複数のスレッドを持つことができ、各プロセスは、それ自体のメモリを有する、共有メモリのプロセス内の各スレッド、各スレッドは、独自の独立したメモリを持っています。私はマルチスレッド技術を使用したいので(明らかに、この関係は非常に重要!で覚えておいてください)、我々は最初のプロセス、作成されたOSを作成するプロセスを持っている必要があり、あなたはそれを達成することができますか?いいえ、通常はCまたはC ++言語が完了しました。

マルチスレッドの特性

  • ランダムの
    ここに画像を挿入説明
    スレッド状態
    ここに画像を挿入説明
    、スレッドのライフサイクル、5つの状態の合計:

  • 1)新しい状態(新):作成されたオブジェクトの後ときのような新たな状態になりスレッド:スレッドT =新しいMyThread()。

  • 2)レディ状態(Runnableを):start()メソッド(t.start(コーリングスレッドオブジェクト);)、レディ状態であるスレッド。準備状態のスレッドに、このスレッドを例示するものであるt.startの実装(と言うことではない、任意の時点で実行されるようにスケジュールCPUを待って、準備ができている)このスレッドは直ちに実行されます。

  • 3)実行状態(実行):CPUのスレッドのスケジューリングがレディ状態で開始し、この時間は本当にランモードに入るのスレッドを実行することができましたさ。注:準備状態は、最初にすべてのは、即応の状態である必要があり、実行中の状態を入力するために、スレッドの実行で動作状態、アクセスの唯一の手段です。

  • 4)ブロッキング状態(ブロック):一時的に再びCPUと呼ばれるチャンスがあり、それがレディ状態に入るまでのブロックに、この時間は、CPUを使用して実行を停止する権利を放棄し、何らかの理由でスレッドを実行しています動作状態に進みます。

  • 5)様々な理由のために生じるが遮断状態を三種類に分けることができ、ブロックされました。

  • a)は待機ブロック:実行実行状態待ち()メソッドのスレッドなので、スレッドが待機状態の閉塞に入ること。
  • b)は、同期ブロック:同期スレッド同期ロックの失敗を(ロックが別のスレッドによって占領されたので)を取得、それは同期ブロッキング状態になります。
  • C)ブロックされた:睡眠()を呼び出すか、スレッドを(結合)またはI / O要求を発行し、スレッドがブロッキング状態に入ります。睡眠()タイムアウトは、参加()またはスレッドのタイムアウト待ちが終了するため、またはI / O処理は、準備完了状態にスレッドが再び完了しています。
  • 6)死状態(デッド):スレッドの実行が上や、異常終了するrun()メソッド、ライフサイクルの糸端です。

マルチスレッドは1作成:継承スレッドを

本質的にThreadクラスは、スレッドのインスタンスを表す、Runnableインタフェースのインスタンスを達成することです。スレッドを開始する唯一の方法は、開始スレッドクラスによって()インスタンスメソッドです。スタートは()メソッドがネイティブメソッドである、それは基礎となるオペレーティングシステムに通知し、最終的には、オペレーティング・システムによって、新しいスレッド、オペレーティングシステムの実行にはrun()メソッドを起動します。これは直接スレッドを拡張し、そのクラスを介して、マルチスレッド達成するための非常に単純な方法であり、複製のrun()メソッドは、新しいスレッドを開始し、run()メソッドを自分で定義を実行することができます。(各スレッドはrun()メソッドを呼び出して、オープン複数のスレッドをシミュレートしました。)

一般的な方法

文字列のgetName()

      返回该线程的名称。 

静的スレッドcurrentThread()

      返回对当前正在执行的线程对象的引用。 

空のsetName(文字列名)

      改变线程名称,使之与参数 name 相同。

静的な無効スリープ(ロングミリ秒)

 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

無効開始()

      使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

スレッド(文字列名)

      分配新的 Thread 对象。

テスト

public class Test1  {
    public static void main(String[] args) {
       //3、创建线程对象
       ThreadDemo t1 = new ThreadDemo("钢铁侠");
       ThreadDemo t2 = new ThreadDemo("美队");
       //4、开启线程:谁抢到资源谁就先执行
       t1.start();
       t2.start();
       //t1.run();//当做常规方法调用,且 不会发生多线程现象
    }
}

//1、作为Thread的子类,并重写run方法。把多线程的业务写在run方法中
class ThreadDemo extends Thread{  
public ThreadDemo() {}
    public ThreadDemo(String name) {
       super(name);
    } 
    @Override
    public void run() {
       //2、默认实现是super.run();
       for (int i = 0; i < 10; i++) {
           System.out.println(getName()+i);
       }
    }
}

マルチスレッドは2を作成します。Runnableを実装します

あなたのクラスがすでに別のクラスを拡張する場合、多重継承は、この時点で、あなたは、Runnableインタフェースを実現することができますすることはできません。

一般的な方法

無効実行()

      使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。 

テスト

public class Test2 {
    public static void main(String[] args) {
       MyThread t = new MyThread ();
       //2,构造创建对象,传入Runnable子类
       Thread target = new Thread(t); 
	   Thread target2 = new Thread(t);
       //开启线程
       target.start();
       target2.start();
    }
}

//1,实现Runnable接口,重写run()
class MyThread implements Runnable{
    @Override
    public void run() {
       for (int i = 0; i < 10; i++) {
       System.out.println(Thread.currentThread().getName()+" "+i);
       }
    }
}

:あなたは、実行順序が混乱で、我々はすでに、単に、実行するためにどのような特定の時間、オペレーティングシステムのスレッドは準備ができているかを決定するオペレーティングシステムに通知し、我々はJVMを制御することはできませんstart()メソッドを知って見ることができます。順不同で、それが正常である理由はここにあります。


比較します
ここに画像を挿入説明

ゲンロック:同期

一度だけのスレッドを聞かせて、一緒にコードパッケージに問題があるかもしれません。sychronizedキーワードを経由して同期します。動作する複数のオブジェクトが共有している場合、データの同期ロックは、スレッドの安全性の問題を解決するために使用することができます。

同期(オブジェクト){
同期コードを必要とします
}

特徴
1、前提1、二つ以上のスレッド同期のニーズを。
2、複数のスレッド間の前提2は、同じロックを使用する必要があります。
図3は、不利な点は、同期は、スレッドの安全性を確保するために、プログラムのパフォーマンスが低下し、性能を犠牲にしなければならないということです。
図4に示すように、改変することができる方法は、同期方法、これを用いて、ロックオブジェクトと呼ばれています。
図5は、コードブロックを修正することができるシンクブロックと呼ばれる、任意のロックオブジェクトであることができます。


公開された36元の記事 ウォン称賛13 ビュー1058

おすすめ

転載: blog.csdn.net/weixin_44598691/article/details/104870494