我尝试过延迟(或休眠)我的Java程序,但是出现了一个错误。
我无法使用Thread.sleep(x)或wait()。同样的错误信息出现:
interruptedexception;必须被捕获或宣布被丢弃。
在使用Thread.sleep()或wait()方法之前,是否需要任何步骤?
我尝试过延迟(或休眠)我的Java程序,但是出现了一个错误。
我无法使用Thread.sleep(x)或wait()。同样的错误信息出现:
interruptedexception;必须被捕获或宣布被丢弃。
在使用Thread.sleep()或wait()方法之前,是否需要任何步骤?
当前回答
使用下面的编码结构来处理异常
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
//Handle exception
}
其他回答
Thread.sleep()对于初学者来说很简单,可能适用于单元测试和概念证明。
但是请不要在产品代码中使用sleep()。最终sleep()可能会狠狠地咬你一口。
多线程/多核java应用程序使用“线程等待”概念的最佳实践。Wait释放线程持有的所有锁和监控器,这允许其他线程获得这些监控器,并在您的线程平静睡眠时继续执行。
下面的代码演示了该技术:
import java.util.concurrent.TimeUnit;
public class DelaySample {
public static void main(String[] args) {
DelayUtil d = new DelayUtil();
System.out.println("started:"+ new Date());
d.delay(500);
System.out.println("half second after:"+ new Date());
d.delay(1, TimeUnit.MINUTES);
System.out.println("1 minute after:"+ new Date());
}
}
DelayUtil实现:
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class DelayUtil {
/**
* Delays the current thread execution.
* The thread loses ownership of any monitors.
* Quits immediately if the thread is interrupted
*
* @param durationInMillis the time duration in milliseconds
*/
public void delay(final long durationInMillis) {
delay(durationInMillis, TimeUnit.MILLISECONDS);
}
/**
* @param duration the time duration in the given {@code sourceUnit}
* @param unit
*/
public void delay(final long duration, final TimeUnit unit) {
long currentTime = System.currentTimeMillis();
long deadline = currentTime+unit.toMillis(duration);
ReentrantLock lock = new ReentrantLock();
Condition waitCondition = lock.newCondition();
while ((deadline-currentTime)>0) {
try {
lock.lockInterruptibly();
waitCondition.await(deadline-currentTime, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
} finally {
lock.unlock();
}
currentTime = System.currentTimeMillis();
}
}
}
正如其他用户所说的,你应该用try{…} catch{…}。但是自从Java 1.5发布以来,有了一个TimeUnit类,它的功能与Thread.sleep(millis)相同,但更方便。 您可以选择睡眠操作的时间单位。
try {
TimeUnit.NANOSECONDS.sleep(100);
TimeUnit.MICROSECONDS.sleep(100);
TimeUnit.MILLISECONDS.sleep(100);
TimeUnit.SECONDS.sleep(100);
TimeUnit.MINUTES.sleep(100);
TimeUnit.HOURS.sleep(100);
TimeUnit.DAYS.sleep(100);
} catch (InterruptedException e) {
//Handle exception
}
它还有其他的方法: TimeUnit Oracle文档
当使用Android(我唯一一次使用Java)时,我会建议使用处理程序而不是让线程进入睡眠状态。
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i(TAG, "I've waited for two hole seconds to show this!");
}
}, 2000);
参考:http://developer.android.com/reference/android/os/Handler.html
你们有很多书要读。从编译器错误到异常处理,线程和线程中断。但这将达到你想要的效果:
try {
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
放置你的线程。睡在一个尝试捕捉块
try {
//thread to sleep for the specified number of milliseconds
Thread.sleep(100);
} catch ( java.lang.InterruptedException ie) {
System.out.println(ie);
}