Java线程休眠是指在执行某个任务时,使当前线程暂停一段时间,以便其他线程有机会执行。它可以用来实现多个任务之间的同步,也可以用来让一个线程在执行特定任务时暂停一段时间。
Java中有两个方法可用于实现线程休眠:Thread.sleep()和Object.wait()。Thread.sleep()方法可以让当前正在执行的线程暂停一段时间;而Object.wait()方法则是让当前正在执行的对象进入“静止”或“休眠”的状态(即不再处理其他事情),直到其他对象通过notify()或notifyAll()方法将其唤醒。
// 使用 Thread.sleep() 方法实现休眠 public void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } }
// 使用 Object.wait() 方法实现休眠 public void wait(long millis) { try { synchronized (this) { // 同步代码块 // 调用 wait 时必须要在同步代码块中 // 否则将出错 this.wait(millis); } } catch (InterruptedException e) { e.printStackTrace(); } }
Thread.sleep()方法可能会造成当前正在运行的代码出错(如果该代码是处于同步代码块中的话)。而Object.wait()方法则不会造成这样的问题。因此,如果要使用Java中的休眠功能来实施各个任务之间的同步(即保证多个任务之间能够有序地执行),则应该使用Object.wait()方法。
Thread类包含一个静态sleep()方法,它使线程在指定的持续时间内休眠。
Thread.sleep()方法接受超时作为参数。
我们可以指定超时的毫秒数,或毫秒和纳秒。执行此方法的线程将休眠指定的时间。
操作系统调度程序不调度睡眠线程以接收CPU时间。
如果线程在进入休眠之前拥有锁的所有权,则它在休眠期间继续保持这些锁。
sleep()方法抛出java.lang.InterruptedException,你的代码必须处理它。
下面的代码演示了使用Thread.sleep()方法。
public class Main { public static void main(String[] args) { try { System.out.println("sleep for 5 seconds."); Thread.sleep(5000); // The "main" thread will sleep System.out.println("woke up."); } catch (InterruptedException e) { System.out.println("interrupted."); } System.out.println("done."); } }
上面的代码生成以下结果。
java.util.concurrent包中的TimeUnit枚举表示各种单位(如毫秒,秒,分钟,小时,天等)的时间测量值。
它有sleep()方法,其工作方式与Thread.sleep()相同。
我们可以使用TimeUnit的sleep()方法来避免持续时间转换:
TimeUnit.SECONDS.sleep(5); // Same as Thread.sleep(5000);
完整的源代码
import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) { try { System.out.println("sleep for 5 seconds."); TimeUnit.SECONDS.sleep(5); // Same as Thread.sleep(5000); // The "main" thread will sleep System.out.println("woke up."); } catch (InterruptedException e) { System.out.println("interrupted."); } System.out.println("done."); } }
上面的代码生成以下结果。
Java线程教程 -Java守护线程线程可以是守护线程或用户线程。守护线程是服务提供者线程。当JVM检测到应用程序中的所有线程都只是...
Java线程教程 -Java Fork/Join框架fork/join框架通过利用机器上的多个处理器或多个内核来解决问题。该框架有助于解决涉及并行性...
Java网络教程 -Java数据报套接字通道java.nio.channels.DatagramChannel类表示数据报通道。默认情况下,它是阻塞。要使其无阻塞...