我正在尝试开发一个国际象棋游戏计时器。 应该有一个类似的功能
等待用户输入从控制台移动
如果等待时间> 60
停止等待,继续前进。
我能想到的解决这个问题的方法是使用 Thread ,例如:
public class Game {
Thread t1 = new PlayDisc(this);
Thread t2 = new Timer(this);
public static void main(String[] args) {
t1.start();
t2.start();
}
}
public class Timer extends Thread{
Game g;
public Timer(Game g) {
this.g = g;
}
@Override
public void run() {
int i = 0;
while(true){
if(i > 6000) {
g.t1.interrupt();
break;
}
}
}
}
public class PlayDisc extends Thread{
private Game g;
public PlayDisc(Game g) {
this.g = g;
}
@Override
public void run() {
Scanner s = new Scanner(System.in);
int x = s.nextInt();
int y = s.nextInt();
Point p = new Point(x, y);
cm.nextPoint = p;
s.close();
}
}
我知道这不起作用,因为 Scanner.nextInt() 是一种阻塞方法。但我需要从命令行读取输入。 有什么办法可以解决这个问题吗?
最佳答案
已经有一个 Timer
类(实际上是两个,java.util.Timer
和 javax.swing.Timer
)。但正如您所意识到的,nextInt()
的阻塞性质会阻止您在超时后执行任何操作。您将需要一个额外的库,它可以为您提供比 Java 默认情况下更好的控制台控制。或者使用 Swing
。
编辑:通过使用 hasNextInt()
的轮询循环,可能可以执行某种黑客攻击。这样你就不会让扫描线程阻塞。
重新编辑:不,这是不可能的,因为 hasNext() 会阻塞。您必须测试中断是否能让您摆脱这里的麻烦(可能不会)。
关于java - 线程中的阻塞方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23602525/