セマフォーとマルチスレッドの使用について一般的には勉強していますが、スタックしています。私はそれぞれGとHを印刷する2つのスレッドを持っています、そして、私の目的は、出力文字列がこのようになるように各スレッドの出力を交互にすることです。セマフォーを使用して2つのスレッドから代替出力を出力する
G
H
G
H
G
H
二つのクラスのそれぞれについて、以下
public class ClassA extends Thread implements Runnable{
Semaphore semaphore = null;
public ClassA(Semaphore semaphore){
this.semaphore = semaphore;
}
public void run() {
while(true)
{
try{
semaphore.acquire();
for(int i=0; i<1000; i++){
System.out.println("F");
}
Thread.currentThread();
Thread.sleep(100);
}catch(Exception e)
{
System.out.println(e.toString());
}
semaphore.release();
}
}
}
以下のようなレイアウトは、私が取得しています出力は私からあまりにも異なっている
public static void main(String[] args) throws InterruptedException {
Semaphore semaphore = new Semaphore(1);
ClassA clasA = new ClassA(semaphore);
Thread t1 = new Thread(clasA);
ClassB clasB = new ClassB(semaphore);
Thread t2 = new Thread(clasB);
t1.start();
t2.join();
t2.start();
私のメインクラスですました期待される結果。誰でも私を助けてくれる?私はセマフォを誤用しましたか?どんな助け?
あなたが本来のロックまたはリエントラントロックやセマフォまたは何を使用する場合、あなたが期待される順序を得るために、フォワードパスを提案してくださいだろうか、ただのロックを使用して[OK]を任意の順番 –
を強制しません、問題ではありませんか。上記のコードの弱点は何ですか? – Jazztheman