如何在方法返回java中的值之前暂停执行

时间:2013-09-17 12:38:42

标签: java multithreading

我几乎是java threading的新手。我有一个场景,我在JSON发布rabbitmq queue消息,外部服务正在对收到的JSON执行操作,然后在执行外部服务后,它将返回一个integer中的值,表示执行是否成功。

我想调用外部服务,然后想要等待返回值,即生成器的执行停止,直到使用者函数返回值。

你的帮助非常明显。请给我一个主题,比如是否使用synchronized方法,Future和Callable接口等。

感谢。请不要说“向我们展示你到目前为止所尝试过的东西等”,我只需要你提出如何做的建议。 :)

2 个答案:

答案 0 :(得分: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可以解决这个问题

......通过良好的旧时循环可以实现相同的效果。

答案 1 :(得分:0)

join()函数在许多编程语言(包括Java)的名称和函数中都很常见。它的作用就是让调用线程等到被调用者/子线程完成后,ei。它一直等到子线程返回。

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完成并返回之前不会到达最后一行。