【发布时间】:2015-01-26 09:33:02
【问题描述】:
我想在我的 java (Android) 程序中每 2 秒后连续生成随机数至少 10 分钟。但我只想暂停/延迟仅以一种方法执行代码,而不是整个程序。
我尝试过像这样使用线程 -
boolean stop = false;
int random_number = 0;
while(true){
if(stop){ //if stop becomes true, then
return; //terminate the method
}
random_number = Math.random(); //generate random number
//which is used bu some other
//part of code
try {
Thread.sleep(2000); //delay the code for 2 secs
} catch(InterruptedException ex) { //and handle the exceptions
Thread.currentThread().interrupt();
}
}
但是,这不起作用,因为Thread.sleep 停止整个程序的执行,而只是停止执行方法内的代码,我的整个屏幕变成空白。
我也尝试过使用Handler,但它也不起作用,因为它不会停止执行我的方法中的代码,而是只是堆叠起来。
这将更好地展示它的工作原理 -
while(true){
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("After 2 secs"); //this gets printed
//later
}
}, 2000);
System.out.println("Before 2 secs"); //this gets printed first
}
所以代码叠加起来就相当于使用 while 循环,而且速度非常慢。
另外,由于我正在为 Android 开发应用程序,我在 Java SE 6 上运行,所以我不能使用 scheduleAtFixedRate。有没有其他方法可以做到这一点?
非常感谢!
【问题讨论】:
-
为什么不实现定时器,而不是线程?
-
另外,如果您想使用
Thread.sleep(n),请记住在新线程中运行您的方法 - 您所做的可能是在导致 UI 冻结的 UI 线程中运行它。不过,@Stultuske 建议的计时器是个好主意。 -
好的。让我尝试。非常感谢。
-
@user1685095 正确使用线程并不是基础。他来这里学习。
-
是的,那是你的恕我直言。我不这么认为。如果您正在编程,您应该了解线程。这是使用线程的基础知识。恕我直言,并发问题可能不是基础。是的,如果他只是在学习,那完全没问题。虽然我建议在完整的计算机而不是移动设备上学习纯 Java,因为那样很容易。