我目前有一个方法我想循环一段时间。我试过创建这样的两个线程
Thread t = new Thread();
t.start();
Runnable r = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(length);
t.interrupt();
} catch (InterruptedException ex) {
}
}
};
Thread s = new Thread(r);
s.start();
while(!t.isInterrupted()){
runCurrentPres(current);
}
但是我似乎无法打破循环,因为某种原因,它永远不会被打断。
答案 0 :(得分:3)
isInterrupted
方法实际上比hasPendingInterruption
多wasEverInterrupted
。当在该线程中抛出InterruptedException
时,该标志会自动清除(只能在某些点发生,例如在您呼叫睡眠时),或者如果有人调用interrupted()
(与{{1}不同}})。
阅读official Java tutorial on Interrupts了解详情。
已退出的线程无法暂停中断。
但是,这不是限制主线程运行时间的好方法。检查每次迭代的时间都可以达到你想要的效果:
isInterrupted()
请注意,这只会在每个long end = System.currentTimeMillis() + length;
while(System.currentTimeMillis() < end){
runCurrentPres(current);
}
调用之间进行检查,因此如果该函数需要很长时间才能执行,那么您的循环将比预期稍晚完成。但是,这与原始代码的相同行为相同。
答案 1 :(得分:2)
那么这个呢?
long time = System.currentTimeMillis();
while (time + length > System.currentTimeMillis()) {
runCurrentPres(current);
}
无需使用线程。
答案 2 :(得分:0)
使用你的建议我去了
long end = System.currentTimeMillis() + length;
while(System.currentTimeMillis() < end){
runCurrentPres(current);
}
如注释中所述,由于for循环,runcurrent需要时间来执行。因此我在for循环的每次迭代之前改变了要检查的解决方案,它最终像这样,并且按预期工作
long time = System.currentTimeMillis();
while (time + length > System.currentTimeMillis()) {
files = updateFiles(current);
for (File f : files) {
if(time + length < System.currentTimeMillis()){
break;
}
是的,在线程中使用while(true)的解决方案使用70%cpu