スレッドの学習
3464 ワード
スレッドについて:
実はJavaを書く最初のプログラムはすでにスレッドを使っていて、Hello Worldプログラムを実行すると、制御作用のメインスレッドが作成されます.
マルチスレッドについて:
マルチスレッドのプログラムを使用すると、マルチプロセッサを議論してもパラレル処理を議論しても、スレッドが実際に独立して実行されるわけではありません.いつでも1つのスレッドしか実行されません.これは、各スレッドにCPUが実行する時間ブロックが割り当てられ、他のスレッドの実行を待たなければならないためである.ただ、CPUの処理速度が速いため、複数のスレッドが同時に実行されているようです.
スレッドクラスの作成について:
2つの方法があります.1.拡張スレッドクラス;2 Runnableインタフェースを実装します.インタフェースのできるだけインタフェースを学ぶことができれば、拡張スレッドクラスを選択するとそんなに柔軟ではないので、他の親クラスを継承することはできません.選択インタフェースは違います.複数のインタフェースを実現することができ、このような拡張性が比較的強い.
スレッドのライフサイクルについて:
スレッドの完全なライフサイクルには、新しいステータス、実行可能ステータス、実行可能ステータス、実行不可ステータス、死亡ステータスの5つのステータスが含まれます.
3の場合、1つのスレッドが実行可能な状態に入ることができません.sleepメソッドが呼び出され、wait状態が呼び出され、I/Oが待機しています.
スレッド同期について:
生産者/消費者の問題はスレッド同期の典型的な問題であり、synchronizedキーワードを使用してこの保護を得る必要があります.
生産者/消費者の問題のコード:
これは他の人が書いたものですが、参照してください.
スレッドセキュリティについて:
synchronizedキーワードを使用してロックし、この領域を保護します.この臨界領域は、1つのアプリケーションの複数のスレッドによって共有データにアクセスするために安全に使用できます.しかし、デッドロックを防止するには、1つのスレッドで使用するリソースを他のスレッドにロックすることはできません.このスレッドは、他のスレッドが完了するために必要なリソースをロックします.例えばスレッドAの完了にはリソース1とリソース2が必要であり、スレッドBにもリソース1とリソース2が必要である.スレッドAがリソース1をロックし、スレッドBがリソース2をロックすると、デッドロックが発生します.
これは私のスレッドに対する少しの認識で、足りないところ、どうぞよろしくお願いします.
実は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をロックすると、デッドロックが発生します.
これは私のスレッドに対する少しの認識で、足りないところ、どうぞよろしくお願いします.