我不知道这种情况是否可能,我不知道应该怎样做才能满足我的需求。我有一个名为A的类。在A类中我有02个方法(m1和m2)和01个线程。该线程将负责监听任何传入消息的套接字连接。如果消息到达,则线程将调用m1方法来处理消息。该类在实例化时启动该线程。
然后我有方法m2,它负责向套接字发送消息(线程正在侦听的套接字)。每次方法m2向套接字发送消息时,都会有来自套接字的响应消息。我没有实现代码,因为套接字有时也会发送随机消息,因此在发送消息后立即监听套接字。
我的问题是,有没有办法,当我的方法m2发送消息时,它会等到方法m1(由线程调用)在退出之前完成?
非常感谢你。
答案 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()
)。这是完成您请求的最简单的方法,而无需自己处理同步。它还允许您设置超时,以防您不想永远阻止。