あなたは並行プログラミングに関するより多くのデータを検索する必要があるが、私はないので、基本的な、まあ、今いくつかの基本をあなたに伝えることができますが、私は自分のベストを尽くします。
ここでは、モニターを持っている、それは抽象的な概念であり、履歴書には、モニターがすべてと クラスであり、それは、それは、唯一 つのスレッド が メソッドにアクセスすることができ を修飾子として「syncronized」 を使用して 方法を意味しています すぐに。so、モニターでは、 印刷したい 変数 で と「フラグ」、 わかりますその 変数 がmodified.Finally、 た場合は 、 最も重要なことを見ることができます"wait()"と "notify()"のメソッド これらのメソッド は、スレッドを停止するか、または のスレッドをもう一度再生します。あなたの変数が変更された場合
あなたは
printValue()メソッドでは、ここで を尋ね、変数was'nt変更した場合は、待機()メソッドと一緒に寝てthead要素を入れて、そしてときに、他の
方法changeValue()が実行され、値が変更され、通知()メソッドは、スレッドを目覚め、と呼ばれる、そう、このすべてをやっている、あなたは、三つのことを保証することができます
安全性:ことを意味しますスレッドはあなたが望むことを実行します デッドロックの不在:将来は目が覚めるでしょう。 ミューテックス:重要なコードを実行しているスレッドが1つだけであることを意味します(例:op。 "++"はアトミックではありませんが、より多くのアクションで細分化され、ローカルvarを作成し、var、sum、およびasignを読み込みます。したがって、複数のスレッドがゲーム内にある場合、例:複数のスレッドが実行しているため、次のコードで起こるそうであっても起こり、そして可能性
i = 0;
i ++;
output: 1;
output: 2;
output: 3;
output: 5;
output: 4;
output: 7;
、。あなたが注文したい場合は
public class BClass extends Thread{
private Monitor ac;
public BClass(Monitor ac) {
this.ac = ac;
}
@Override
public void run() {
int v = 0;
while(true){
this.ac.changeValue(v);
v++; // this sum is not secure, if you want to print an
// ascending order, the code is diferent, I will show in
// above.
}
}
、今:ついに
public class AClass extends Thread{
private Monitor ac;
public AClass(Monitor ac) {
this.ac = ac;
}
@Override
public void run() {
while(true){
this.ac.printValue();
}
}
}
そして:まあ、これは複数のスレッド、多かれ少なかれ今
public class Monitor {
private int value = 0;
public static boolean valueHasChanged = false;
public synchronized int changeValue(int newValue){
this.value = newValue;
Monitor.valueHasChanged = true;
this.notify();
return this.value + 1;
}
public synchronized void printValue(){
while(!Monitor.valueHasChanged){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(this.value);
Monitor.valueHasChanged = false;
}
public static void main(String[] args) {
Monitor ac = new Monitor();
BClass t1 = new BClass(ac);
AClass t2 = new AClass(ac);
t1.start();
t2.start();
}
public int getValue() {
return this.value;
}
}
スレッドをプログラムする方法があります表示:
public class Monitor {
private int value = 0;
public boolean valueHasChanged = false;
private boolean hasPrint = true;
public synchronized void changeValue(int newValue) {
this.value = newValue;
this.valueHasChanged = true;
this.notify();
}
public synchronized void changeValuePlusOne() {
while (!hasPrint) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.value++;
this.valueHasChanged = true;
this.hasPrint = false;
this.notifyAll();
}
public synchronized void printValue() {
while (!this.valueHasChanged) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this.value);
this.valueHasChanged = false;
this.hasPrint = true;
this.notifyAll();
}
public static void main(String[] args) {
Monitor ac = new Monitor();
BClass t1 = new BClass(ac);
AClass t2 = new AClass(ac);
t1.start();
t2.start();
}
public int getValue() {
return this.value;
}
}
とスレッド:
public class BClass extends Thread{
private Monitor ac;
public BClass(Monitor ac) {
this.ac = ac;
}
@Override
public void run() {
while(true){
this.ac.changeValuePlusOne();
}
}
}
他のスレッドを見に等しい:あなたは、変数を変更したとき
public class AClass extends Thread{
private Monitor ac;
public AClass(Monitor ac) {
this.ac = ac;
}
@Override
public void run() {
while(true){
this.ac.printValue();
}
}
}
あなたは 'true'に' engineService.getFlagを() 'に設定されていますか?私はあなたのコードでそれを見ることはありません... – brso05
正しい軌道に乗っています...代わりに約束するコール可能な、将来の... –