如何让线程等待 lambda?

问题描述 投票:0回答:1

这是我第一次搞乱线程。该项目使用 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);
    }
}
java multithreading
1个回答
0
投票

除了因为您在

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
时才会被调用。

© www.soinside.com 2019 - 2024. All rights reserved.