-1

私はほぼ初心者ですjava threadingJSONにメッセージを投稿rabbitmq queueし、外部サービスが受信した操作を実行し、外部サービスの実行後、実行が成功したかどうかを示すJSON値を返すというシナリオがあります。integer

外部サービスを呼び出してから戻り値を待ちたい、つまりコンシューマー関数が値を返すまでプロデューサーの実行を停止したい。

あなたの助けは非常に高く評価されています。同期されたメソッドを使用するかどうか、または Future および Callable インターフェイスなどを使用するかどうかなどのトピックを教えてください。

ありがとう。「今まで試したことを見せて」などとは言わないでください。それを行う方法についての提案が必要なだけです。:)

4

2 に答える 2

1

少し前に試した古典的な生産者と消費者の問題を見てください...元のブログ/チュートリアルへのリンクはありませんが、代わりにコードを次に示します。

 public class ProducerConsumerTest {
  public static void main(String[] args) {
    CubbyHole c = new CubbyHole();
    Producer p1 = new Producer(c, 1);
    Consumer c1 = new Consumer(c, 1);
    p1.start(); 
    c1.start();
  }
}
class CubbyHole {
 private int contents;
 private boolean available = false;
 public synchronized int get() {
   while (available == false) {
      try {
        wait();
       }
       catch (InterruptedException e) {
       }
    }
    available = false;
    notifyAll();
    return contents;
 }
  public synchronized void put(int value) {
    while (available == true) {
     try {
        wait();
     }
     catch (InterruptedException e) { 
     } 
    }
    contents = value;
    available = true;
    notifyAll();
 }
}

class Consumer extends Thread {
   private CubbyHole cubbyhole;
   private int number;
   public Consumer(CubbyHole c, int number) {
    cubbyhole = c;
   this.number = number;
   }
  public void run() {
     int value = 0;
     for (int i = 0; i < 10; i++) {
        value = cubbyhole.get();
          System.out.println("Consumer #" + this.number+ " got: " + value);
   }
  }
  }

  class Producer extends Thread {
  private CubbyHole cubbyhole;
  private int number;

 public Producer(CubbyHole c, int number) {
 cubbyhole = c;
 this.number = number;
 }

 public void run() {
 for (int i = 0; i < 10; i++) {
   cubbyhole.put(i);
   System.out.println("Producer #" + this.number+ " put: " + i);
    try {
    sleep((int)(Math.random() * 100));
     } catch (InterruptedException e) { }
  }
 }
 }

秘訣は、コンシューマが前の要素の消費を終了するまでプロデューサー スレッドをスリープ状態にすることです。私が提供したサンプル コードでは、sleep がうまく機能します。

...同じ効果は、古き良き while ループで実現できます。

于 2013-09-17T12:43:35.783 に答える
0

このjoin()関数は、Java を含む多くのプログラミング言語で名前と機能の両方で非常に一般的です。それが行うことは、呼び出し先/子スレッドが完了するまで、呼び出し元のスレッドを待機させることだけです。子スレッドが戻るまで待機します。

Thread t = new Thread() {
    public void run() {
        System.out.println("1");
        // Something that takes a long time to compute.
    }
 };
 t.start();
 t.join();
 System.out.println("2");

出力は順番になります。t が終了して戻るまで、最後の行に到達しないためです。

于 2013-09-17T12:44:01.127 に答える