函数在Java中等待另一个函数

时间:2015-03-27 14:24:05

标签: java

我不知道这种情况是否可能,我不知道应该怎样做才能满足我的需求。我有一个名为A的类。在A类中我有02个方法(m1和m2)和01个线程。该线程将负责监听任何传入消息的套接字连接。如果消息到达,则线程将调用m1方法来处理消息。该类在实例化时启动该线程。


然后我有方法m2,它负责向套接字发送消息(线程正在侦听的套接字)。每次方法m2向套接字发送消息时,都会有来自套接字的响应消息。我没有实现代码,因为套接字有时也会发送随机消息,因此在发送消息后立即监听套接字。


我的问题是,有没有办法,当我的方法m2发送消息时,它会等到方法m1(由线程调用)在退出之前完成?


非常感谢你。

2 个答案:

答案 0 :(得分:1)

您可以使用wait / notify方法。你需要一些共同的对象作为锁。有关详细信息,请查看https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

答案 1 :(得分:0)

这是典型的生产者消费者情况。处理数据(产生)的线程1和线程2处理该数据的处理(消耗)。我不确定你是如何在线程之间传递数据的,但是应该使用某种同步构造来完成。以下是如何使用BlockingQueue执行此操作的示例,该示例可避免任何直接实现锁定或条件变量的原因

//Shared Queue
BlockingQueue<Data> queue = new LinkedBlockingQueue<Data>();

线程一(接收)

//get Data object d here 
queue.put(d);

假设您没有为队列指定容量,则不会阻止(除非您的队列为queue.size() == Integer.MAX_VALUE

线程2(流程)

Data d = queue.take(); //this will block indefinitely until there is data available
//process data here

由于BlockingQueue内置了锁和条件变量,因此您无需手动处理此问题。阻止与调用await()(类似于object.wait())基本相同,当有可用数据时,调用signal()(类似于object.notify())。这是完成您请求的最简单的方法,而无需自己处理同步。它还允许您设置超时,以防您不想永远阻止。