【发布时间】:2017-09-27 10:56:51
【问题描述】:
我有一个可运行的游戏对象。游戏是通过 twitter 玩的,所以当游戏需要玩家输入时,我有一个这样的函数:
private synchronized void waitForInput() {
input = "";
while(input == ""){
System.out.println("Waiting...");
try{
synchronized(this){
// wait for a second then continue to check the loop condition
this.wait(1000);
}
}
catch(Exception e){
System.out.println("failed to wait.");
e.printStackTrace();
}
}
System.out.println("Finished waiting.");
}
private volatile String input 是 Player 类的实例变量。我有一个 Twitter 侦听器在等待某人发布该机器人的推文,然后在收到所述推文后,它将推文文本作为输入并设置此实例变量,从而跳出循环。我对这种方法并不特别满意,因为在这里等待是没有意义的——而且这里不需要使用 notify()——似乎我正在接近这个错误。但是,我不知道如何等待(),然后还访问实例变量输入以更新它,因为线程在同步块中并且无法执行输入的 setter 方法。
有人对更好的方法有任何想法吗?
【问题讨论】:
-
看看
java.util.concurrent.locks.Condition -
你的方法对我来说似乎很合理。但是请注意,您不应该通过
==运算符比较 Java 中的字符串,因为它将比较对象的引用并返回false如果它不是同一个对象。请改用.equals()方法。
标签: java multithreading oop object twitter