public static void randomN () {
int requestTime = 2;
if(requestTime > 0) {
requestTime--;
myTimer.scheduleAtFixedRate(new TimerTask() {
public void run() {
int randomx = (int) (Math.random()*6+1);
int randomy = (int) (Math.random()*6+1);
System.out.println("Requests" + "X : " + randomx + " Y: " + randomy);
}
}, 0, 1000);
} else {
myTimer.cancel();
myTimer.purge();
}
}
我希望我的计时器在public void run(){...}中执行任务,并且每秒执行2秒。但是这段代码不能正常工作。
答案 0 :(得分:1)
在此代码中:
public static void randomN () {
int requestTime = 2;
if(requestTime > 0) { //..
你的requestTime在if语句时总是2,无论你调用方法多少次。我想你想要
static int requestTime = 2;
public static void randomN () {
if(requestTime > 0) { //..
答案 1 :(得分:1)
你不会停止,因为你在requestTime
开始之前只减少了一次Timer
。计时器仅使用您给出的时间段重复执行run()
方法内的代码。因此,如果您想要更新requestTime
,则必须使用run()
方法进行更新。
final int requestTime = 2;
final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
int aRequestTime = requestTime;
@Override
public void run() {
if(aRequestTime > 0)
{
aRequestTime--;
}
else timer.cancel();
}
}, 0, 2000);
尝试在Timer
上下文中声明您的requestTime
和Class
而不是功能,以摆脱final
变量。如您所知,本地内部类:Anonymous
类不会更改局部变量。
答案 2 :(得分:1)
尝试在两次执行后从任务内部取消计时器,并将scheduleAtFixedRate(TimerTask,long,long)
的最后一个参数更改为2000毫秒。也许第二个,如果你想在2秒后开始它。
final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
private int counter = 2;
@Override
public void run() {
counter--;
if(counter >= 0)
System.out.println(counter + " more ticks to go.");
else
timer.cancel();
}
}, 0, 2000);
答案 3 :(得分:0)
将代码修改为下一个:
private static volatile Timer myTimer = new Timer();
private static volatile int runTimes = 0;
public static void randomN () {
myTimer.scheduleAtFixedRate(new TimerTask() {
public void run() {
runTimes++;
printRandomXY();
cancelTimerIfRunTwice();
}
}, 0, 1000);
}
private static void printRandomXY() {
int randomx = (int) (Math.random()*6+1);
int randomy = (int) (Math.random()*6+1);
System.out.println("Requests" + "X : " + randomx + " Y: " + randomy);
}
private static void cancelTimerIfRunTwice() {
if (runTimes == 2) {
myTimer.cancel();
myTimer.purge();
}
}