当前位置 : 主页 > 编程语言 > java >

java waitfor

来源:互联网 收集:自由互联 发布时间:2023-09-06
Java中的wait()和notify()方法是实现线程间通信的重要工具。wait()方法使线程等待,直到其他线程调用notify()或notifyAll()方法来唤醒它,而notify()方法则唤醒一个等待的线程。在本文中,我们

Java中的wait()和notify()方法是实现线程间通信的重要工具。wait()方法使线程等待,直到其他线程调用notify()或notifyAll()方法来唤醒它,而notify()方法则唤醒一个等待的线程。在本文中,我们将深入了解这两个方法的用法和原理,并通过代码示例来说明它们的作用。

wait()方法的用法和原理

wait()方法是Object类中的一个方法,可以在任何对象上调用。当一个线程执行wait()方法时,它会被阻塞,直到其他线程调用相同对象上的notify()或notifyAll()方法才能继续执行。

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

  1. wait(): 使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。
  2. wait(long timeout): 使当前线程等待指定的毫秒数,直到其他线程调用该对象的notify()或notifyAll()方法,或者超时时间到达。

wait()方法必须在同步块中调用,因为它会释放同步锁。这也是为什么wait()方法是Object类中的方法,因为任何对象都可以用作同步锁。

下面是一个示例代码,演示了wait()方法的用法:

class MyThread implements Runnable {
    public void run() {
        synchronized(this) {
            try {
                System.out.println("Thread " + Thread.currentThread().getId() + " is waiting...");
                this.wait();
                System.out.println("Thread " + Thread.currentThread().getId() + " is awake");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread);
        Thread thread2 = new Thread(myThread);
        
        thread1.start();
        thread2.start();
        
        Thread.sleep(1000); // 等待1秒钟
        
        synchronized(myThread) {
            myThread.notify(); // 唤醒一个等待的线程
        }
    }
}

上述代码中,我们创建了一个MyThread类,它实现了Runnable接口。在run()方法中,我们使用synchronized关键字来同步代码块,并在同步块内部调用了wait()方法。在main()方法中,我们创建了两个线程并启动它们,然后等待1秒钟后调用notify()方法唤醒一个等待的线程。

notify()方法的用法和原理

notify()方法也是Object类中的一个方法,用于唤醒一个等待的线程。如果有多个线程在等待,那么只会唤醒其中一个线程,具体唤醒哪个线程是不确定的。

notify()方法有两种重载形式:

  1. notify(): 唤醒在该对象上等待的单个线程。
  2. notifyAll(): 唤醒在该对象上等待的所有线程。

下面是一个示例代码,演示了notify()方法的用法:

class MyThread implements Runnable {
    public void run() {
        synchronized(this) {
            System.out.println("Thread " + Thread.currentThread().getId() + " is running...");
            this.notify();
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread);
        Thread thread2 = new Thread(myThread);
        
        synchronized(myThread) {
            thread1.start();
            myThread.wait(); // 等待线程1唤醒
            thread2.start();
        }
    }
}

上述代码中,我们创建了一个MyThread类,它实现了Runnable接口。在run()方法中,我们使用synchronized关键字来同步代码块,并在同步块内部调用了notify()方法来唤醒一个等待的线程。在main()方法中,我们创建了两个线程,并在同步块中先启动线程1,然后等待线程1唤醒后再启动线程2。

wait()和notify()的流程图

下面是wait()和notify()方法的基本流程图:

flowchart TD
A[线程
【文章原创作者:香港显卡服务器 http://www.558idc.com/hkgpu.html 网络转载请说明出处】
上一篇:java list 更新某个字段
下一篇:没有了
网友评论