Java中的线程通信:wait、notify与Condition详解
在Java中,线程通信是多线程编程中非常重要的一个方面,它允许线程之间进行有效的协作和同步。本文将深入探讨Java中的线程通信机制,重点介绍wait、notify和Condition的使用,以及它们在不同场景下的应用与实现。
线程通信的基础概念
在多线程编程中,线程通信是指多个线程在共享资源的情况下如何进行协作以实现特定的任务。主要涉及到的概念包括:
- 共享资源:多个线程可以访问和修改的对象或数据。
- 临界区:对共享资源进行访问的代码段,需要保证同一时间只有一个线程可以访问。
- 同步:通过某种机制使得多个线程按照特定的顺序执行,避免出现数据竞争和不一致的问题。
wait和notify方法
在Java中,每个对象都有一个锁(monitor),通过synchronized关键字可以获取对象的锁。线程可以通过wait方法释放锁并进入等待状态,直到其他线程调用notify方法唤醒它们。
package cn.juwatech; public class WaitNotifyExample { private static final Object lock = new Object(); private static boolean flag = false; public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> { synchronized (lock) { while (!flag) { try { System.out.println("Thread 1 is waiting..."); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread 1 is running after notified."); } }); Thread thread2 = new Thread(() -> { synchronized (lock) { System.out.println("Thread 2 is running..."); flag = true; lock.notify(); } }); thread1.start(); Thread.sleep(1000); // Ensure thread1 starts waiting first thread2.start(); } }
Condition接口的使用
Java中的Condition接口提供了更加灵活和高级的线程等待/唤醒机制,通常与Lock接口一起使用。
package cn.juwatech; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionExample { private static final Lock lock = new ReentrantLock(); private static final Condition condition = lock.newCondition(); private static boolean flag = false; public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> { lock.lock(); try { while (!flag) { try { System.out.println("Thread 1 is waiting..."); condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Thread 1 is running after signaled."); } finally { lock.unlock(); } }); Thread thread2 = new Thread(() -> { lock.lock(); try { System.out.println("Thread 2 is running..."); flag = true; condition.signal(); } finally { lock.unlock(); } }); thread1.start(); Thread.sleep(1000); // Ensure thread1 starts waiting first thread2.start(); } }
总结
通过本文的介绍,我们深入理解了Java中的线程通信机制,包括基于synchronized的wait和notify方法,以及基于Lock和Condition的更加灵活的实现方式。在实际应用中,合理使用这些机制可以有效地控制线程的执行顺序和资源的访问,从而提升程序的性能和可靠性。