我正在开展一个小项目,我希望能够通过按键来调用方法。我只想让方法每1/2秒调用一次。有没有办法可以设置一个计时器来跟踪按键被推出多长时间,然后在每次调用该方法后重置它?这是伪代码的想法
public class Checker{
public Checker(x){
Timer t=new Timer(x);
t.start();
int i=1;
while(i=1){
if(Keypressed.K && t>500){
//call method
}
t.restart();
}
你们认为这是最好的方法吗?如果我的程序处于活动状态或者它只是停留在循环中,我的程序是否可以执行其他操作?
答案 0 :(得分:1)
在您的按键代码上,将long
变量设置为上次成功按键。
每次用户按下该键时,检查上次成功按下的时间是否足够长以允许输入。
long lastPress = 0;
public void keyPress()
{
if(lastPress + 500 > System.currentTimeMillis())
return;
//dostuff
lastPress = System.currentTimeMillis();
}
这应该是最佳的,因为您不再需要担心多线程检查以查看是否已经过了足够的时间,而只需检查用户输入。
编辑:
工作证明:
public class Test
{
private static long lastPress = 0;
public static void main(String[] args)
{
long start = System.currentTimeMillis();
while(System.currentTimeMillis() - 4000 < start)
{
keyPress();
}
}
public static void keyPress()
{
if(lastPress + 500 > System.currentTimeMillis())
return;
System.out.println("Successful press at " + System.currentTimeMillis());
lastPress = System.currentTimeMillis();
}
}
进入compilejava.net,在Debian上运行,JDK 1.8.0_60
输出:
Successful press at 1447291059524
Successful press at 1447291060024
Successful press at 1447291060524
Successful press at 1447291061024
Successful press at 1447291061524
Successful press at 1447291062024
Successful press at 1447291062524
Successful press at 1447291063024
Successful press at 1447291063524
是否会随Thread.sleep()
随机推迟,但这可以解决问题
答案 1 :(得分:-1)
您可以使用sleep
来实现目标,但不建议执行此类方法。
public class SleepMessages {
public static void main(String args[])
throws InterruptedException {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
for (int i = 0; i < importantInfo.length; i++) {
//Pause for 4 seconds
Thread.sleep(4000);
//Print a message
System.out.println(importantInfo[i]);
}
}
}
if(Keypressed.K){
//call method
Thread.sleep(500)
}