我得到异常时使用Thread.sleep(x)或wait()

我尝试过延迟(或休眠)我的Java程序,但是出现了一个错误。

我无法使用Thread.sleep(x)wait()。同样的错误信息出现:

interruptedexception;必须被捕获或宣布被丢弃。

在使用Thread.sleep()wait()方法之前是否需要任何步骤?

893150 次浏览

你们有很多书要读。从编译器错误到异常处理,线程和线程中断。但这将达到你想要的效果:

try {
Thread.sleep(1000);                 //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}

看看在这篇精彩的简短文章中如何正确地做到这一点。

本质上:捕获InterruptedException。记住,您必须添加这个捕获块。这篇文章对此作了进一步的解释。

使用下面的编码结构来处理异常

try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
//Handle exception
}

把你的Thread.sleep放在一个try catch块中

try {
//thread to sleep for the specified number of milliseconds
Thread.sleep(100);
} catch ( java.lang.InterruptedException ie) {
System.out.println(ie);
}

试试这个:

try{


Thread.sleep(100);
}catch(Exception e)
{
System.out.println("Exception caught");
}

或者,如果你不想处理线程,试试这个方法:

public static void pause(int seconds){
Date start = new Date();
Date end = new Date();
while(end.getTime() - start.getTime() < seconds * 1000){
end = new Date();
}
}

它在您调用它时开始,在秒数过去时结束。

正如其他用户所说,你应该用try{...} catch{...}块包围你的调用。但是自从Java 1.5发布以来,有了TimeUnit类,它与thread . sleep(飞船)做同样的事情,但更方便。 你可以选择睡眠操作的时间单位

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文档 < / p >
public static void main(String[] args) throws InterruptedException {
//type code




short z=1000;
Thread.sleep(z);/*will provide 1 second delay. alter data type of z or value of z for longer delays required */


//type code
}

如:-

class TypeCasting {


public static void main(String[] args) throws InterruptedException {
short f = 1;
int a = 123687889;
short b = 2;
long c = 4567;
long d=45;
short z=1000;
System.out.println("Value of a,b and c are\n" + a + "\n" + b + "\n" + c + "respectively");
c = a;
b = (short) c;
System.out.println("Typecasting...........");
Thread.sleep(z);
System.out.println("Value of B after Typecasting" + b);
System.out.println("Value of A is" + a);




}
}

我给Java程序添加延迟的方法。

public void pause1(long sleeptime) {
try {
Thread.sleep(sleeptime);
} catch (InterruptedException ex) {
//ToCatchOrNot
}
}


public void pause2(long sleeptime) {
Object obj = new Object();
if (sleeptime > 0) {
synchronized (obj) {
try {
obj.wait(sleeptime);
} catch (InterruptedException ex) {
//ToCatchOrNot
}
}
}
}
public void pause3(long sleeptime) {
expectedtime = System.currentTimeMillis() + sleeptime;
while (System.currentTimeMillis() < expectedtime) {
//Empty Loop
}
}

这是针对顺序延迟的,但对于循环延迟则参考Java延迟/等

当使用安卓(我使用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

一个更简单的等待方法是使用System.currentTimeMillis(),它返回自UTC 1970年1月1日午夜以来的毫秒数。例如,等待5秒:

public static void main(String[] args) {
//some code
long original = System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis - original >= 5000) {
break;
}
}
//more code after waiting
}
这样,你就不必在线程和异常上瞎折腾了。 希望这能有所帮助!< / p >

使用java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

睡一秒钟或者

TimeUnit.MINUTES.sleep(1);

睡一分钟。

由于这是一个循环,这就提出了一个固有的问题-漂移。每次你运行代码然后睡觉的时候,你都会从运行中飘忽不定,比如说,每一秒。如果这是一个问题,那么不要使用sleep

此外,sleep在控制方面不是很灵活。

对于每秒运行一个任务或延迟一秒的任务,我将强烈推荐[ScheduledExecutorService][1]和[scheduleAtFixedRate][2]或[scheduleWithFixedDelay][3]。

每秒运行myTask方法(Java 8):

public static void main(String[] args) {
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}


private static void myTask() {
System.out.println("Running");
}

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();
}
}
}