线程间通信:wait和notify
线程间通信:wait和notify
1、Object的wait和notify方法
Java中的Object
类提供了两个重要的方法,用于线程间的通信和同步:wait()
方法和notify()
方法
wait()
方法的定义
- 方法签名:
public final void wait() throws InterruptedException
。 - 功能:使当前线程等待,直到其他线程调用此对象的
notify()
或notifyAll()
方法。换句话说,当一个线程调用某个对象的wait()
方法时,它会进入这个对象的等待池中,并释放该对象的对象锁(监视器)。 - 使用条件:必须在同步块(synchronized block)或同步方法中调用,因为当前线程必须拥有该对象的监视器。如果试图在非同步环境中调用
wait()
,会抛出IllegalMonitorStateException
异常。
notify()
方法的定义
- 方法签名:
public final void notify()
。 - 功能:唤醒在此对象监视器上等待的单个线程。如果有多个线程都在此对象上等待,则选择一个线程进行唤醒,选择是任意性的。注意,调用
notify()
方法并不会立即使等待线程从wait()
返回,而是需要等到当前线程释放了该对象的监视器之后,被选中的等待线程才有机会获得该监视器并继续执行。 - 使用条件:也必须在同步块或同步方法中调用,因为当前线程必须拥有该对象的监视器。如果试图在非同步环境中调用
notify()
,也会抛出IllegalMonitorStateException
异常。
2、消费者和生产者代码
商店类
import java.util.ArrayList;
import java.util.List;
public class Store {
public Store(){}
private List<String> apples = new ArrayList<>();
private Object o = new Object();
public void custom(){
synchronized(o){
if (apples.size() == 0) {
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String apple = apples.get(apples.size()-1);
System.out.println("消费者消费了:"+apple);
apples.remove(0);
o.notify();
}
}
public void product(String apple){
synchronized(o){
if (apples.size() > 0) {
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
apples.add(apple);
System.out.println("生产者生产了:"+apple);
o.notify();
}
}
}
消费者类
public class Customer implements Runnable{
private Store store;
public Customer(Store store){
this.store = store;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
store.custom();
}
}
}
生产者类
public class Producter implements Runnable{
private Store store;
public Producter(Store store){
this.store = store;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
store.product("苹果"+i);
}
}
}
执行类
import java.util.ArrayList;
import java.util.List;
public class CustomerProducter {
/**
* 1. 生产者:没有产品,就要开始生产,生产完毕通知消费者,有产品等待消费者消费
* 2. 消费者:有产品,开始消费,消费完毕通知生产者,没有产品等待生产者生产
* 3. 缓冲区
*
*/
public static void main(String[] args) {
Store store = new Store();
Customer customer = new Customer(store);
Producter producter = new Producter(store);
new Thread(customer).start();
new Thread(producter).start();
}
}
执行结果
生产者生产了:苹果0
消费者消费了:苹果0
生产者生产了:苹果1
消费者消费了:苹果1
...
生产者生产了:苹果98
消费者消费了:苹果98
生产者生产了:苹果99
消费者消费了:苹果99
原文地址:https://blog.csdn.net/qq_42948831/article/details/143898246
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!