スレッドの学習

3464 ワード

スレッドについて:
実はJavaを書く最初のプログラムはすでにスレッドを使っていて、Hello Worldプログラムを実行すると、制御作用のメインスレッドが作成されます.
 
マルチスレッドについて:
マルチスレッドのプログラムを使用すると、マルチプロセッサを議論してもパラレル処理を議論しても、スレッドが実際に独立して実行されるわけではありません.いつでも1つのスレッドしか実行されません.これは、各スレッドにCPUが実行する時間ブロックが割り当てられ、他のスレッドの実行を待たなければならないためである.ただ、CPUの処理速度が速いため、複数のスレッドが同時に実行されているようです.
 
スレッドクラスの作成について:
2つの方法があります.1.拡張スレッドクラス;2 Runnableインタフェースを実装します.インタフェースのできるだけインタフェースを学ぶことができれば、拡張スレッドクラスを選択するとそんなに柔軟ではないので、他の親クラスを継承することはできません.選択インタフェースは違います.複数のインタフェースを実現することができ、このような拡張性が比較的強い.
 
スレッドのライフサイクルについて:
スレッドの完全なライフサイクルには、新しいステータス、実行可能ステータス、実行可能ステータス、実行不可ステータス、死亡ステータスの5つのステータスが含まれます.
3の場合、1つのスレッドが実行可能な状態に入ることができません.sleepメソッドが呼び出され、wait状態が呼び出され、I/Oが待機しています.
 
スレッド同期について:
生産者/消費者の問題はスレッド同期の典型的な問題であり、synchronizedキーワードを使用してこの保護を得る必要があります.
生産者/消費者の問題のコード:
public class TestThread {
	public static void main(String[] args) {
		SyncStack ss = new SyncStack();
		Producer p = new Producer(ss);
		Consumer c = new Consumer(ss);
		new Thread(p).start();
		new Thread(p).start();
		new Thread(p).start();
		new Thread(c).start();
	}
}

class WoTou {
	int id; 
	WoTou(int id) {
		this.id = id;
	}
	public String toString() {
		return "WoTou : " + id;
	}
}

class SyncStack {
	int index = 0;
	WoTou[] arrWT = new WoTou[6];
	
	public synchronized void push(WoTou wt) {
		while(index == arrWT.length) {
			try {
				System.out.println("  !");
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();		
		arrWT[index] = wt;
		index ++;
	}
	
	public synchronized WoTou pop() {
		while(index == 0) {
			try {
				this.wait();
				System.out.println("  !");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		return arrWT[index];
	}
}

class Producer implements Runnable {
	SyncStack ss = null;
	Producer(SyncStack ss) {
		this.ss = ss;
	}
	
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = new WoTou(i);
			ss.push(wt);
System.out.println("   :" + wt);
			try {
				Thread.sleep((int)(Math.random() * 200));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}

class Consumer implements Runnable {
	SyncStack ss = null;
	Consumer(SyncStack ss) {
		this.ss = ss;
	}
	
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = ss.pop();
System.out.println("   : " + wt);
			try {
				Thread.sleep((int)(Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}

これは他の人が書いたものですが、参照してください.
 
スレッドセキュリティについて:
synchronizedキーワードを使用してロックし、この領域を保護します.この臨界領域は、1つのアプリケーションの複数のスレッドによって共有データにアクセスするために安全に使用できます.しかし、デッドロックを防止するには、1つのスレッドで使用するリソースを他のスレッドにロックすることはできません.このスレッドは、他のスレッドが完了するために必要なリソースをロックします.例えばスレッドAの完了にはリソース1とリソース2が必要であり、スレッドBにもリソース1とリソース2が必要である.スレッドAがリソース1をロックし、スレッドBがリソース2をロックすると、デッドロックが発生します.
 
これは私のスレッドに対する少しの認識で、足りないところ、どうぞよろしくお願いします.