在Java中,线程是非常重要的概念,可以使程序具有并发执行的能力。线程的状态转换及其处理方法对于编写高效且正确的并发程序至关重要。本文将重点介绍Java中线程状态的转换以及wait()方法的使用。

一、线程状态转换

在Java中,线程的状态可以分为以下几种:

  • 新建(New):线程对象被创建但还没有调用start()方法。
  • 就绪(Runnable):线程可以被系统调度,在等待CPU执行。
  • 运行(Running):线程正在执行。
  • 阻塞(Blocked):线程被阻塞,暂时停止执行。
  • 死亡(Dead):线程执行完毕,结束生命周期。

线程的状态转换如下图所示:

Thread State Transition

二、wait()方法

wait()方法是Java中Object类提供的一个方法,它的作用是使当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法唤醒它。

wait()方法有三种重载形式:

  1. void wait():当前线程等待,并释放它所持有的锁。
  2. void wait(long timeout):当前线程等待指定的时间(以毫秒为单位)。
  3. void wait(long timeout, int nanos):当前线程等待指定的时间(以毫秒和纳秒为单位)。

当一个线程调用wait()方法时,它会释放自己持有的锁,并进入等待状态,直到其他线程通过notify()或notifyAll()方法唤醒它。被唤醒的线程会重新竞争锁,一旦获得锁,它就可以继续执行。

三、示例代码

下面是一个使用wait()方法实现线程之间通信的示例:

Text
public class ThreadCommunicationExample {
    public static void main(String[] args) {
        final Processor processor = new Processor();
        
        // 线程A
        Thread threadA = new Thread(() -> {
            try {
                processor.produce();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        // 线程B
        Thread threadB = new Thread(() -> {
            try {
                processor.consume();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        threadA.start();
        threadB.start();
    }
}
class Processor {
    public void produce() throws InterruptedException {
        synchronized (this) {
            System.out.println("Producer thread running...");
            wait(); // 等待其他线程调用notify()或notifyAll()方法唤醒
            System.out.println("Producer thread resumed...");
        }
    }
    
    public void consume() throws InterruptedException {
        Thread.sleep(2000); // 模拟耗时操作
        synchronized (this) {
            System.out.println("Consumer thread running...");
            notify(); // 唤醒等待的线程
            System.out.println("Notify sent...");
        }
    }
}

上述代码创建了两个线程,一个生产者线程(threadA)和一个消费者线程(threadB)。生产者线程调用produce()方法后会进入等待状态,并释放持有的锁。消费者线程在执行到consume()方法时会休眠2秒钟,然后唤醒等待的生产者线程。生产者线程被唤醒后会重新竞争锁,并继续执行。

通过使用wait()方法和notify()方法,线程之间可以进行有效的通信,实现更加灵活和高效的并发编程。

本文介绍了Java中线程状态的转换及其处理方法,并详细讲解了wait()方法的使用。通过合理地管理线程的状态以及利用wait()方法实现线程之间的通信,可以编写出高效且正确的并发程序。