我无法使用
Thread.sleep(x)
或wait()
。出现相同的错误消息:未报告的异常java.lang.InterruptedException;必须被捕获或声明为被抛出。
使用
Thread.sleep()
或wait()
方法之前是否需要采取任何步骤?#1 楼
您前面有很多阅读材料。从编译器错误到异常处理,线程和线程中断。但这将满足您的要求:try {
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
评论
感谢您的帮助,我能够运行它。.此外,catch(interruptedException ex)的用途是什么
– Vincent低
10年7月27日在10:35
请参阅Abel的回复。 Google for InterruptedException。简而言之:线程可以在睡眠时中断,这是一种异常,需要显式处理。
– Konrad Garus
2010年7月27日10:46
一些答案告诉对异常不做任何事情,有人说抛出,这告诉interrupt()。有人愿意讨论哪个合适以及为什么吗?
–苏马
13年5月21日在9:53
@Suma关于它的讨论很多,包括Stack Overflow本身。只是搜索它。评论太久了。几年后,我唯一的答案是:取决于情况。通常理想的解决方案是终止线程正常执行的任何操作(例如,回滚此事务,中断循环等),但这取决于上下文。
– Konrad Garus
13年5月21日在11:40
因此,比计时器有什么用?您可以使用计时器实现相同的功能吗?我阅读了Java文档,其中提到了一些有关延迟的内容,但是作为一名具有代码的新手,即时消息即将结束我的高中编程的第二年,即时消息不完全确定它所谈论的延迟是否在这里有用,甚至正确使用的班级
– Ungeheuer
2015年6月13日20:11
#2 楼
正如其他用户所说,您应该在呼叫周围加上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文档
评论
请参见其他答案,例如有关如何用必需的try-catch异常处理来包围这些调用的示例。
–罗勒·布尔克
13-10-28在3:33
不要忘记“ import java.util.concurrent.TimeUnit;”。
–编码器
15年11月21日在21:12
#3 楼
看看这篇出色的简短文章,了解如何正确执行此操作。本质上:抓住
InterruptedException
。请记住,您必须添加此catch-block。帖子进一步解释了这一点。#4 楼
使用以下编码构造来处理异常try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
//Handle exception
}
#5 楼
将您的Thread.sleep
放入尝试捕获块try {
//thread to sleep for the specified number of milliseconds
Thread.sleep(100);
} catch ( java.lang.InterruptedException ie) {
System.out.println(ie);
}
#6 楼
当使用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
评论
这是针对Android而非Core Java
–甘尼什·克里希南
16 Mar 18 '16 at 0:24
#7 楼
试试这个:try{
Thread.sleep(100);
}catch(Exception e)
{
System.out.println("Exception caught");
}
评论
在Java中捕获Exception不好的做法吗?
–迈克尔·多斯特(Michael Dorst)
2014年8月23日下午5:31
像这里的其他答案一样,更好地捕获InterruptedException
–devsaw
2015年10月15日19:16
这就是所谓的“ Pokemon Exception Handler”(Pokemon异常处理程序)-必须全部捕获。
–james_s_tayler
16年4月1日在20:25
#8 楼
我为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 Delay / Wait。
评论
请注意,这里不允许公开宣传自己。请参阅帮助中心此处的最后一点。但是,您可以将链接放在个人资料中-允许。
– S.L.巴特-恢复莫妮卡
2015年11月5日,7:37
#9 楼
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);
}
}
#10 楼
一种更简单的等待方式是使用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
}
这样,您不必为线程和异常而烦恼。
希望这会有所帮助!
评论
等待时会消耗CPU。
– yacc
17年11月20日在2:22
@yacc这是对的,但是它比使用线程更简单,并且不占用太多CPU。
–山姆
17年11月20日在13:24
#11 楼
使用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");
}
#12 楼
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();
}
}
}
#13 楼
另外,如果您不想处理线程,请尝试以下方法:public static void pause(int seconds){
Date start = new Date();
Date end = new Date();
while(end.getTime() - start.getTime() < seconds * 1000){
end = new Date();
}
}
它在您调用它时开始,在经过秒数后结束。
评论
这会在睡眠时间消耗CPU。在Thread.sleep()上可以调度线程。
– Vivek Pandey
13年6月28日在9:28
你是骑手,没有水:D
– M410
2014年7月6日在23:08
user2276378误解了问题的英语。 OP表示他“无法使用睡眠或等待”,user2276378认为这意味着他无法使用(或不允许使用它们),因此他提供了不使用睡眠或等待的有效解决方案。尽量不要太苛刻英语不是每个人的母语。
– David Newcomb
14-10-9在9:35
评论
好吧,这很受欢迎。必须有很多人需要将Java程序延迟几秒钟。很难想象。当然,在帖子上贴上正确的标题会很有帮助。