Java 如何在线程';s sleep()方法立即执行
我试图通过调用Thread类的Java 如何在线程';s sleep()方法立即执行,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,我试图通过调用Thread类的sleep()方法暂停部分程序的执行几秒钟。但是,当我尝试此操作时,调用之后立即出现的代码仍然会立即执行。例如,如果我有代码: Thread compoundThread = new Thread(new Runnable() { public void run() { try { Thread.currentThread().sleep(200
sleep()
方法暂停部分程序的执行几秒钟。但是,当我尝试此操作时,调用之后立即出现的代码仍然会立即执行。例如,如果我有代码:
Thread compoundThread = new Thread(new Runnable()
{
public void run()
{
try
{
Thread.currentThread().sleep(2000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
Thread.currentThread().interrupt();
}
}
});
compoundThread.start();
System.out.println("line 15")
第15行立即打印。有办法解决这个问题吗?我认为sleep()
方法的全部思想是暂停执行
根据Philipp的评论进行编辑
while (totalNoOfPhase1Trials > 399)
{ //
Phase1Trial phase1Trial = new Phase1Trial(numberOfElements, elementColors);
displayComplexStimulus(phase1Trial.getComplexStimulus());
validate();
Thread compoundThread = new Thread(new Runnable(){
public void run() {
try {
Thread.currentThread().sleep(2000);
System.out.println("line 226");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
}
}
});
compoundThread.start();
try {
compoundThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
displaycomoundstimultium
方法显示一组jlabel
,当我不包括您刚才提到的线程休眠位置的代码时,该方法不会延迟。但是,当我包含使线程进入睡眠状态的代码时,图像的显示也会延迟两秒,这很奇怪,因为thread.sleep()
在图像显示后执行。我建议您使用simple
thread.sleep(2000)
主线程是开始运行main方法的线程 然后,主方法创建一个新的
Thread
对象并调用compoundThread.start()代码>,导致第二个线程开始执行
紧接着,主线程在不停止的情况下继续执行并到达print语句。因此,主线程正在打印第15行
您启动的second线程休眠2秒,然后终止。如果在sleep
调用之后将print语句放入线程的run
方法中,那么在打印第15行之前会有2秒钟的暂停这里compoundThread
是一个新的线程对象。您的行15
通过main方法执行。因此,当您启动compoundThread.start()
时,将创建一个新线程,并独立于主线程启动
如果您想减慢主线程的速度,只需在可运行对象代码之外使用thread.sleep(2000)
代码的行为与实现的相同。您正在运行主线程,该线程启动另一个线程,该线程休眠2000毫秒
因此,您的主线程执行以下操作:
启动复合线程
打印出来
精加工主螺纹
根据您想要实现的目标,您可以删除整个线程并执行以下操作:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// should not happen, you don't interrupt
}
System.out.println("line 15");
否则,您可以将输出移动到线程的run方法中:
Thread compoundThread = new Thread(new Runnable(){
public void run() {
try {
Thread.sleep(2000);
System.out.println("line 15");
} catch (InterruptedException e) {
// do whatever has to be done
}
}
});
compoundThread.start();
// you might want to wait until compoundThread is done
compoundThread.join();
更新:基于您对延迟输出的评论
如果使用以下代码:
public static void main(String[] args) {
System.out.println("Hello");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// should not happen, you don't interrupt
}
System.out.println("World");
}
输出将是“Hello”,在“World”之后两秒。线程将睡眠两秒钟。原始线程(主线程)启动一个新线程,新线程睡眠两秒钟。原始线程没有,这就是为什么它会立即打印“第15行”。因此,Sandeep的建议虽然简洁,但如果您理解并正确应用它,它应该会起作用。另一个明显的可能性是将System.out.println
语句放在compoundThread
的run
方法中
查看并告诉我它是否起作用你能为你的代码添加行号吗?我不知道怎么做,但System.out.println(“第15行”)是第15行。一个线程将在另一个执行上下文中执行;你期待什么?那么你是说在run方法中有打印行吗?谢谢你的详细解释。我现在明白了。@siegi该死的,我错过了那个解决方案:)你关于删除整个线程的建议给我带来了问题,因为它也会将thread.sleep()行之前的打印语句的执行延迟两秒,我不知道为什么。你能提供完整的代码来理解你的意思吗?对不起,不是打印语句,我指的是我显示的图像。我的代码在jpanel中显示了一些JLabel。但是,当我使用thread.sleep()使主线程进入睡眠状态时,现在不仅打印语句,图像显示也会延迟两秒钟,尽管图像应该在线程进入睡眠状态之前显示,这是没有意义的。图像显示没有延迟,但是当我在显示图像的行之后添加代码行:Thread.sleep()时,图像显示也会延迟两秒。@lb91:我猜您使用的是打印
,而不是线程.sleep()之前的打印ln
。Java(确切地说是PrintWriter
)仅在使用println
时才会自动刷新。使用System.out.flush()
在执行Thread.sleep()
之前强制刷新。另请参见。我发现,当我这样做时,它最终会将Thread.sleep(2000)之前的代码执行速度降低两秒。例如,如果我在Thread.sleep(2000)方法之前放一条print语句,在Thread.sleep(2000)方法之后放一条print语句,这两条print语句将同时打印,这对我来说毫无意义。@lb91就是这样。这取决于您希望睡眠的时间和线程。正如其他答案所指出的,如果您在外部使用它,它将降低主线程的速度,在runnable内部,它将降低该线程的特定实例的速度。@Sandeep:欢迎使用StackOverflow!您可以随时编辑答案(使用下面的链接)。特别是对于发布代码,注释不太合适。在答案中直接使用代码块。请参阅以了解如何正确设置格式。