我编写了一个这样工作的结构:
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:我想让一个线程暂停,直到它接收到数据
最佳答案
不能 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);
}
关于java - 让线程等待对话框输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34344489/