我几乎是java threading
的新手。我有一个场景,我在JSON
发布rabbitmq queue
消息,外部服务正在对收到的JSON
执行操作,然后在执行外部服务后,它将返回一个integer
中的值,表示执行是否成功。
我想调用外部服务,然后想要等待返回值,即生成器的执行停止,直到使用者函数返回值。
你的帮助非常明显。请给我一个主题,比如是否使用synchronized方法,Future和Callable接口等。
感谢。请不要说“向我们展示你到目前为止所尝试过的东西等”,我只需要你提出如何做的建议。 :)
答案 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完成并返回之前不会到达最后一行。