我编写了一个像这样工作的结构:
Activity discoveryActivity - UI thread
↕ Calls through interface
Service discoveryService - Bound service running on UI thread
↕ Actions through Handler.post(↑) or functions (↓)
Runnable connectionThread - Socket networking
某些时候connectionThread
需要String
才能继续。
Handler.post(..)
与discoveryService
discoveryActivity
显示AlertDialog
用户需要大约20秒的时间来输入数据并确认输入。
问题1: 在此期间线程会做什么?
现在我需要再次进入线程。
轻松访问discoveryService
问题2: 如何在不重新启动的情况下让线程再次运行?该线程处于一个复杂的循环中,现在只有几个Socket
!
我的第一个想法是保持线程正常运行
// Inside run()
while(stringWrapper.get() == null) {
Thread.sleep(500);
}
// Outside run()
void setStr(String s) { stringWrapper.set(s); }
但那效率低下
然后我读到wait()
和notify()
我在线程本身和StringWrapper
(一个包含对String
的引用的简单类)上尝试了这一点
我很无奈,我知道wait()
和notify()
是正确的方法吗?
你能给我一个提示,我应该在哪里实现这些以及它们将被调用的对象?
TL; DR:我想让一个线程暂停,直到它收到数据
答案 0 :(得分:1)
不是100%确定您要完成的任务,但您可以使用SettableFuture
(来自Google Guava library)来解决您的问题。
private final SettableFuture<String> stringFuture = SettableFuture.create();
// Inside run()
// This will block your thread until stringFuture is set, or until the given timeout has expired.
final String string = stringFuture.get(1, TimeUnit.MINUTES);
// Outside run()
public void setStr(final String s) {
stringFuture.set(s);
}