2011-12-22 10 views
-1

セマフォを読んだ後、私はこの2つのスレッドAとBを作成するこのテストコードを試しました。私の目標は、スレッドAのスレッドBでのいくつかの操作が完了するまで10秒待ちます。しかし、スレッドBのロジックを少し変えても、決して出てこない無限のwhileループを導入することで、スレッドAもぶら下がり、プログラムは永遠に実行されます。誰でも私が探している目標を達成する方法を教えてもらえますか?セマフォとスレッドの問題

パッケージパック;

import java.util.concurrent.Semaphore; 

public class Concurrency { 
    public int count = 0; 

    public static void main(String args[]) throws Exception { 
    final Semaphore sem = new Semaphore(1, true); 
    Thread thrdA, thrdB; 
    thrdA = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (sem) { 
       try { 
        sem.wait(10000); 
        System.out.println("thread1"); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

     } 
    }); 
    thrdB = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (sem) { 
       System.out.println("thread2"); 

       while(true){ 

       } 
      } 

     } 
    }); 

    thrdA.start(); 
    thrdB.start(); 

    thrdA.join(); 
    thrdB.join(); 

    } 
} 
+4

なぜ、あなたが 'acquire()'してから 'release()'しないのなら、 'セマフォ'を使っていますか?あなたは、その目的のために 'private final Object'を使ったことがあります。 – corsiKa

答えて

0

Glowcoderは正しい - これはあなたのスレッドが何も役に立たないので永遠に実行されます。 thrdAはセマフォを待っています、thrdBは何もしないで永遠にループしています - それはthrdAが待っていることができるように、ある時点でセマフォに何かをしているはずです。

2

コードには多くの問題があります。

  1. コメントと回答に記載されているとおり、待機/通知する場合は、Semaphoreを使用する必要はありません。
  2. while(true)はCPUに負荷をかけます。 Thread.sleepを使用するか、セマフォ/ロックを取得することを検討してください。
  3. 達成したいことについてもっと詳しく説明する必要があります。スレッドBがthreadAを待つようにしたい場合、セマフォ/ロックは必要ありません。 thread2.runで他の通話を行う前にthread1.join()に電話するだけです。
+0

1.yeah私は、(true)はCPUの負荷が大きいのですが、これはちょうど実験的なコードであり、2番目のスレッドがハングした場合に何が起こるかを知るために書きました。秒。 2.また、いくつかの制限のために私のコードでThread.sleepを使用することはできません。 –