这是我第一次搞乱线程。该项目使用 lambda 接收用户输入,因此我需要等到 lambda 获取有效数据才能恢复线程。根据我的研究,除了 while (var == null) {} 之外,我还没有找到更好的方法来做到这一点,这似乎并不理想。
希望展示我想要做的事情的示例是: (我需要在 lambda 中设置一个取决于用户输入的变量,因此它不会立即运行,并且我需要线程等待直到设置变量)
public class MRE {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
InputHandler[] handler = new InputHandler[1];
Thread thread = new Thread(() -> {
Object wait = new Object();
boolean[] matches = new boolean[1];
synchronized (wait) {
handler[0] = (message) -> {
matches[0] = message.equals("true");
wait.notify();
};
try {
wait.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//the thread needs the boolean to be set for whatever it does next
});
thread.start();
while (scanner.hasNext()) {
handler[0].handleMessage(scanner.nextLine());
}
}
interface InputHandler {
void handleMessage(String message);
}
}
除了因为您在
IllegalMonitorStateException
块之外调用 wait.notify()
而等待发生 synchronized
之外,现在无论检查结果是什么,您都可以调用 wait.notify()
。
以下内容仅允许线程在匹配后继续:
Thread thread = new Thread(() -> {
Object wait = new Object();
synchronized (wait) {
handler[0] = (message) -> {
synchronized (wait) {
if (message.equals("true")) {
wait.notify();
}
}
};
try {
wait.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//the thread needs the boolean to be set for whatever it does next
});
wait.notify()
只有在条件为true
时才会被调用。