欢迎访问宙启技术站
智能推送

Java中如何实现线程等待和唤醒?

发布时间:2023-09-08 13:05:56

Java中可以使用以下几种方式实现线程的等待和唤醒:

1. 使用Object类的wait()、notify()和notifyAll()方法:

Object类中的这三个方法可以用于线程的等待和唤醒,前提是线程必须先对对象加锁(即在synchronized代码块或方法内调用这三个方法)。

- wait()方法使当前线程等待,直到其他线程调用对象的notify()或notifyAll()方法唤醒它。

- notify()方法随机唤醒正在等待对象的一个线程。

- notifyAll()方法唤醒正在等待对象的所有线程。

2. 使用Condition接口:

Condition接口是Java并发包中提供的一种更加灵活的线程等待和唤醒机制,可以替代Object类的wait()、notify()和notifyAll()方法。

Condition接口可以通过Lock接口的newCondition()方法创建。

   import java.util.concurrent.locks.*;
   public class MyThread implements Runnable {
     private Lock lock = new ReentrantLock();
     private Condition condition = lock.newCondition();

     public void run() {
       lock.lock();
       try {
         System.out.println("线程等待开始");
         condition.await();
         System.out.println("线程被唤醒");
       } catch (InterruptedException e) {
         e.printStackTrace();
       } finally {
         lock.unlock();
       }
     }

     public void wakeup() {
       lock.lock();
       try {
         System.out.println("线程唤醒开始");
         condition.signal();
         System.out.println("线程唤醒结束");
       } finally {
         lock.unlock();
       }
     }

     public static void main(String[] args) {
       MyThread thread = new MyThread();
       new Thread(thread).start();
       try {
         Thread.sleep(2000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
       thread.wakeup();
     }
   }
   

上述代码中,线程首先调用condition.await()方法进行等待,然后另一个线程调用condition.signal()方法唤醒等待的线程。

3. 使用Thread类的join()方法:

join()方法可以让一个线程等待另一个线程的结束。当一个线程执行另一个线程的join()方法时,它会等待另一个线程执行完毕后再继续执行。

   public class JoinExample {
     public static void main(String[] args) {
       Thread t1 = new Thread(new MyRunnable(), "Thread 1");
       Thread t2 = new Thread(new MyRunnable(), "Thread 2");

       t1.start();
       try {
         t1.join();
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
       t2.start();
     }

     static class MyRunnable implements Runnable {
       public void run() {
         for (int i = 0; i < 5; i++) {
           System.out.println(Thread.currentThread().getName() + ": " + i);
           try {
             Thread.sleep(1000);
           } catch (InterruptedException e) {
             e.printStackTrace();
           }
         }
       }
     }
   }
   

上述代码中,线程t1调用了t1.join()方法,会使主线程等待t1线程执行完毕后再继续执行。

以上是Java中几种常见的线程等待和唤醒的方式。根据实际需求选择合适的方式来实现线程的等待和唤醒操作。