「グラフィカルなマルチスレッドのJavaデザインパターン」ノートプロローグ

  1. 二つの方法で開始したスレッド:
  • スレッドのサブクラスのスレッド使用のインスタンスを起動します。
public class PrintThread extends Thread{
	
	private String message;
	
	public PrintThread(String message){
		this.message = message;
	}
	
	@Override
	public void run() {
		int index = 0;
		while(index<1000){
			System.out.println(message);
			index++;
		}
	}

	public static void main(String[] args) {
		new PrintThread("apple").start();
		new PrintThread("orange").start();
	}
}
  • 例としては、Runnableを実装し、新しいスレッド()コンストラクタのパラメータとして、
public class Printer implements Runnable{

	private String message;
	
	public Printer(String message){
		this.message = message;
	}
	
	@Override
	public void run() {
		int index = 0;
		while(index<1000){
			System.out.println(message);
			index++;
		}
	}
	
	public static void main(String[] args) {
		new Thread(new Printer("apple")).start();
		new Thread(new Printer("orange")).start();
	}
}
  1. スタートは、start()メソッドではなく、run()メソッドのスレッドスレッドのインスタンスを呼び出します。

  2. CPUは次いで、同時処理の順序が実行されるだけである場合(正味の効果は、連続プロセスであるようにスレッドを切り替えるたびに分割は、CPU占有)、及びCPUが複数ある場合、並行処理は、その後、並行して実行することができます。

  3. マルチスレッドプログラミング、ミッション要件に従って正しいスレッド記述する必要がありミューテックス処理同期

  4. (強制的に停止終了除く)通常の動作中のプログラムは、すべてのスレッドの終了後まで、プログラムが終了します。

  5. java.util.concurrentパッケージは、抽象ファクトリがスレッド作成定義インターフェイス ThreadFactory、皮新しいスレッドコード。
    Executors.defaultThreadFactoryは()ThreadFactoryインターフェースのインスタンスを返します。

		ThreadFactory threadFactory = Executors.defaultThreadFactory();
		threadFactory.newThread(new Printer("apple")).start();
  1. スレッドを一時停止:スレッドコードのThread.sleep(1000)は、静的メソッドを通します。

  2. データ人種:内の複数のスレッドの同時操作データやリソースに起因する見越しデータ競合や競合状態と呼ばれる状態の。

  3. Javaキーワードは、同期排他処理スレッドを実行します。
    1)同期:(オブジェクトのロック方法を、ロックの一例として、即ち本)

	public synchronized void deposit(int m){
		//取款
	}

ここに画像を挿入説明
注:2つのsynchronizedメソッドの姿は、ロックを共有します!
各インスタンスは、別々のロックを持っています。従って、一つのことを言わないのインスタンスが、同期の方法が実施されている他のインスタンス同期方法を実行することはできません。
2)同期コードブロック:

		synchronized(this){
			//业务代码
		}
  1. ロックは、このクラスの実装のすべてのインスタンスは、相互に排他的であり、
    同期の静的メソッド:
public static synchronized void deposit(int m)

同期コードブロック:

		synchronized(Bank.class){
			//业务代码
		}
  1. スレッドコラボレーションシナリオ:
    通常のキュー(待ち行列非スレッドセーフ)、読み取りキュースレッド、複数のキューにデータがない、読み取りスレッド待ち、書き込みデータが書き込まれている場合、スレッドを複数のスレッドを作成し、しなければならない通知データテイクを読むことができます待機しているスレッドを。

  2. JavaスレッドはのnotifyAll、通知、協力待ちを介して達成することができます。
    待機待機のアプローチは、スレッドを聞かせて、と通知してスレッドを待って目を覚ますのnotifyAllすることです。
    これらの3つの方法の条件を実現することができるスレッドで、あります。第二に、スレッドがロックを取得します。
    これらの3つの方法はObjectクラスのメソッドです。また、スレッドの方法です。

  3. ----ラウンジキューのスレッドを待っています。スレッドがwaitメソッドを呼び出し保存された後、すべてのインスタンスは、キューを待機キューを持っています。

  4. 次のいずれかが発生すると、スレッドが終了した待ち行列へ戻ります

    1. 他のスレッドがスレッドをウェイクアップする方法を通知しています。
    2. スレッドをウェイクアップするのnotifyAllメソッド他のスレッドが存在。
    3. スレッドをウェイクアップするスレッドの割り込み、他の方法があります。
    4. タイムアウトを待ちます。
  5. 実行待ち、this.wait())は、(待ち時間に等しいです。

  6. waitメソッドを実行するには、スレッドが(規則で)ロックを保持しなければならないが、待ちキューにスレッド場合、ロックはそのインスタンスを解放します。

  7. 通知()キュー内で待機して目を覚ますだろうスレッド終了キューを。スレッドはまた、再取得にロックを必要とし、操作の待ち時間を入力します目を覚ますていない、あなたは次の動作に待つことができる、インスタンス・ロックを再取得する必要があります。

  8. コード(時)ロバストであることが通知を使用するよりのnotifyAll()を使用して一般的に、コード。通知するので、スレッドはラウンジ(WAITING)状態にあった原因と、再開されたスレッドを逃している可能性があります。

  9. スレッド状態の移行、スレッドは次の状態があります:
    1)新しいスレッドの初期状態を作成し、
    スレッド2)実行可能状態が実行されている;
    3)が終了スレッドの終了ステータス。
    4)WAITING、待機()メソッド後TIMED_WAITING。
    5)ロックを取得するためにブロックされた状態(状態の競争、ウォンの前にロックを)BLOCKED;
    スレッドの状態を取得することはThreadクラスgetStateをメソッドを呼び出すことができます。

  10. ブロックされ、WAITING、違いTIMED_WAITING:
    Javaドキュメント公式定義を----
    BLOCKED状態:「状態がスレッドを参照するには、モニターロックを待ってブロックされた」
    待ち「別のスレッドがときにアクションを実行するためのスレッドが待っている:状態がこの状態で「
    TIMED_WAITINGのように状況:」アクションを完了するために、別のスレッドのスレッドの待機は、特定の待機時間以内に」このような状態にあるであろう
    のThread.sleep(睡眠時間)と待機(タイムアウト)TIMED_WAITING状態になります。

出版元の記事 ウォンの賞賛0 ビュー167

おすすめ

転載: blog.csdn.net/gs4214101/article/details/104782178