在 Java 中,线程调度是指 Java 虚拟机 (JVM) 根据特定算法来分配 CPU 时间给各个线程的过程。常用的线程调度方法有以下几种:
-
yield()
方法:- 作用:让出当前线程的执行权,给其他同优先级的线程执行机会。
- 使用场景:当一个线程在执行过程中希望让其他同优先级的线程有机会执行时使用。
- 代码示例:
Thread.yield();
-
sleep(long millis)
方法:- 作用:使当前线程休眠指定的毫秒数,在此期间不会占用 CPU 资源。
- 使用场景:当需要让线程暂停执行一段时间时使用。
- 代码示例:
try { Thread.sleep(1000); // 休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); }
-
join()
方法:- 作用:等待调用
join
方法的线程执行完毕再继续执行当前线程。 - 使用场景:当一个线程需要等待另一个线程执行完毕再继续时使用。
- 代码示例:
Thread t = new Thread(() -> { // 线程 t 的任务 }); t.start(); try { t.join(); // 等待 t 线程执行完毕 } catch (InterruptedException e) { e.printStackTrace(); }
- 作用:等待调用
-
wait()
方法 和notify()/notifyAll()
方法:- 作用:用于线程间的通信与协作。
wait()
使当前线程等待,直到其他线程调用notify()
或notifyAll()
。 - 使用场景:当线程需要等待某个条件满足后再继续执行时使用。
- 代码示例:
synchronized (lock) { while (conditionNotMet) { lock.wait(); // 当前线程等待 } // 条件满足后继续执行 } // 在其他线程中 synchronized (lock) { lock.notify(); // 唤醒等待的线程 }
- 作用:用于线程间的通信与协作。
-
Lock
和Condition
接口的方法:- 作用:提供更灵活的线程间同步与调度控制,特别是与
ReentrantLock
一起使用。 - 使用场景:需要更复杂的线程同步机制时使用。
- 代码示例:
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); lock.lock(); try { while (conditionNotMet) { condition.await(); // 当前线程等待 } // 条件满足后继续执行 } finally { lock.unlock(); } // 在其他线程中 lock.lock(); try { condition.signal(); // 唤醒等待的线程 } finally { lock.unlock(); }
- 作用:提供更灵活的线程间同步与调度控制,特别是与
这些方法在实际开发中经常结合使用,以实现复杂的线程调度和同步机制。