旅游网站开题报告,黄石港区建设局网站,如何本地搭建wordpress,wordpress 改变滑页协作基础#xff08;wait/notify#xff09; Java的根父类是Object#xff0c;Java在Object类而非Thread类中#xff0c;定义了一些线程协作的基本方法#xff0c;使得每个对象都可以调用这些方法#xff0c;这些方法有两类#xff0c;一类是wait#xff0c;另一类是no…协作基础wait/notify Java的根父类是ObjectJava在Object类而非Thread类中定义了一些线程协作的基本方法使得每个对象都可以调用这些方法这些方法有两类一类是wait另一类是notify。 wait方法主要有两个 public final void wait() throws InterruptedException
public final native void wait(long timeout) throws InterruptedException; 一个带时间参数单位是毫秒表示最多等待这么长时间参数为0表示无限期等待。一个不带时间参数表示无限期等待实际就是调用wait(0)。在等待期间都可以被中断如果被中断会抛出InterruptedException。 wait实际上做了什么呢每个对象都有一把锁和一个锁等待队列一个线程在进入synchronized代码块时会尝试获取锁获取不到的话会把当前线程加入等待队列中。其实除了用于锁的等待队列每个对象还有另一个等待队列表示条件队列该队列用于线程间的协作。调用wait就会把当前线程放到条件队列上并阻塞表示当前线程执行不下去了它需要等待一个条件这个条件它自己改变不了需要其他线程改变。当其他线程改变了条件后应该调用Object的notify方法 public final native void notify();
public final native void notifyAll(); notify做的事情就是从条件队列中选一个线程将其从队列中移除并唤醒notifyAll和notify的区别是它会移除条件队列中所有的线程并全部唤醒。 wait/notify方法只能在synchronized代码块内被调用如果调用wait/notify方法时当前线程没有持有对象锁会抛出异常java.lang.IllegalMonitorStateException。 wait的具体过程是 把当前线程放入条件等待队列释放对象锁阻塞等待线程状态变为WAITING或TIMED_WAITING等待时间到或被其他线程调用notify/notifyAll从条件队列中移除这时要重新竞争对象锁 如果能够获得锁线程状态变为RUNNABLE并从wait调用中返回否则该线程加入对象锁等待队列线程状态变为BLOCKED只有在获得锁后才会从wait调用中返回线程从wait调用中返回后不代表其等待的条件就一定成立了它需要重新检查其等待的条件一般的调用模式是 synchronized (obj) {while (条件不成立)obj.wait();... // 条件满足后的操作
} 生产者/消费者模式 下面来看一个生产者和消费者的例子 /*** author 沉默哥* */
public class MyProducerConsumerDemo {static class GoodsQueue {private int size;private QueueString que new ArrayDequeString();public GoodsQueue(int size) {// 维护一个有界队列传入队列的最大容量super();this.size size;}public synchronized void put(String e) throws InterruptedException {while (que.size() size) {System.out.println(队列已满生产者等待);wait();}que.add(e);System.out.println(生产者生产 e);notify();}public synchronized String take() throws InterruptedException {while (que.size() 0) {System.out.println(队列为空消费者等待);wait();}String e que.poll();System.out.println(消费者消费 e);notify();return e;}}static class Producer extends Thread {GoodsQueue que;Random rad new Random();public Producer(GoodsQueue que) {super();this.que que;}Overridepublic void run() {int i 0;try {while (true) {String e String.valueOf(i);que.put(e);i;Thread.sleep(rad.nextInt(1000));// 生产者休息准备下一次生产}} catch (InterruptedException e1) {}}}static class Consumer extends Thread {GoodsQueue que;Random rad new Random();public Consumer(GoodsQueue que) {super();this.que que;}Overridepublic void run() {try {while (true) {que.take();Thread.sleep(rad.nextInt(1000));// 消费者休息准备下一次消费}} catch (InterruptedException e) {}}}public static void main(String[] args) throws InterruptedException {GoodsQueue que new GoodsQueue(1);Producer pro new Producer(que);Consumer con new Consumer(que);con.start();Thread.sleep(500);pro.start();}
} 转载于:https://www.cnblogs.com/JackPn/p/9426366.html