notifyAll

wait, notify, notifyAll and synchronized --

别说谁变了你拦得住时间么 提交于 2020-03-02 11:43:19
Object.notify()的API是这样的: Object.notify Class Overview | Class Members | This Package | All Packages Syntax public final native void notify() Description Wakes up a single thread that is waiting on this object's monitor. A thread waits on an object's monitor by calling one of the wait methods. This method should only be called by a thread that is the owner of this object's monitor. A thread becomes the owner of the object's monitor in one of three ways: By executing a synchronized instance method of that object. By executing the body of a synchronized statement that synchronizes on the object.

Thread Signaling

倾然丶 夕夏残阳落幕 提交于 2020-03-02 10:50:02
本文大概意思都是都下边链接文章转换过来的,没有进行一字一句的翻译,只是把大概意思整里出来。 http://tutorials.jenkov.com/java-concurrency/thread-signaling.html 线程信号的目的是为了线程之间相互通信。线程信号可以使线程等待另其他线程信号,例如thread B 或许等待从thread A 发出的数据准备处理信号。 1 Signaling via Shared Objects 线程之间可以通过共享对象来相互发送信号。Thread A 可以通过在synchronized同步块里设置变量 hasDataToProcess为true ,线程B同样在synchronized同步块里读取hasDataToProcess的值来确定是否有数据可读。 下面是一个简单的信号对象 public class MySignal{ protected boolean hasDataToProcess = false; public synchronized boolean hasDataToProcess(){ return this.hasDataToProcess; } public synchronized void setHasDataToProcess(boolean hasData){ this.hasDataToProcess =

Java并发编程初级篇(十二):使用wait和notify生产者消费者问题

我是研究僧i 提交于 2020-03-02 09:27:11
在这里我们模拟一个生产者消费者问题。定义一个缓冲区,生产者生产数据并存入缓冲区,消费者从缓冲区中消费数据。缓冲区有固定大小,当缓冲区达到最大时生产者被挂起并等待消费者消费数据后再尝试将生产的数据加入缓冲区;当缓冲区数据量为0时,消费者被挂起直到有生产者向缓冲区中存入数据。 我们可以看到这个缓冲区是一个公共变量,所以缓冲区中数据的存放和取出都必须放置在一段synchronized修饰的同步代码中。 Java API的Object类提供了一组方法wait(),notify()和nofityAll()用于实现这个例子。 示例代码: 首先我们创建一个类来模拟实现一个阻塞数据缓冲池,这个缓冲池有一个链表结构用于缓冲数据,有一个整形变量用于定义数据缓冲区大小。一个set()方法用于模拟生产者向缓冲区内加入数据,一旦数据缓冲区满则挂起,成功插入数据后唤起所有消费者线程。一个get()方法用于模拟消费者从缓冲区中消费数据,一旦数据缓冲区空了则挂起,成功消费数据后唤起所有生产者线程。 public class EventStorage { private int maxSize; private LinkedList<Date> storage; public EventStorage() { maxSize = 10; storage = new LinkedList<Date>(); }

Java Thread及其synchronized,wait,sleep,join,yeid,interrupt

浪子不回头ぞ 提交于 2019-12-02 09:05:48
Java SE7 API - Thread: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29 参考资料: http://blog.csdn.net/lqqmisslll/article/details/54208491 一、线程的简介 当JVM启动的时候, 通常会有一个独立的非守护线程(也就是类中的main方法所在的线程).JVM会继续运行,除非发生以下情况: Runtime类的exit()方法被调用,并且安全管理者允许退出发生。 所有非守护线程都已经死了,不管是从run方法中返回的还是因为run方法中抛出了异常。 注意:当所有非守护线程都执行结束(包括主线程),那么守护线程也会退出。因为守护线程是无法脱离非守护线程而独自存在的。 二、创建线程有两种方式: 方法1:声明一个类作为Thread的子类(extends Thread),子类重写(override)Thread类的run()方法。子类的实例可以被分配和start。 //比如:该线程用来计算比指定起始值大的素数。 class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; }

Java notify、notifyAll,wait的描述

独自空忆成欢 提交于 2019-12-02 08:22:03
在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 wait与notify是java同步机制中重要的组成部分。结合与synchronized关键字使用,可以建立很多优秀的同步模型。 synchronized(this){ }等价于publicsynchronized void method(){.....} 同步分为类级别和对象级别,分别对应着类锁和对象锁。类锁是每个类只有一个,如果static的方法被synchronized关键字修饰,则在这个方法被执行前必须获得类锁;对象锁类同。 首先,调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等同于synchronized(obj){......}的内部才能够去调用obj的wait与notify/notifyAll三个方法,否则就会报错: java.lang.IllegalMonitorStateException:current thread not owner 在调用wait的时候,线程自动释放其占有的对象锁,同时不会去申请对象锁。当线程被唤醒的时候,它才再次获得了去获得对象锁的权利。 所以

notify与notifyAll的区别

孤者浪人 提交于 2019-11-29 23:03:55
notify()与notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者最大的区别在于: notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。 简单点来说就是,notifyAll()使所有在wait状态下的线程进入ready状态,当可以执行时一起竞争CPU的时间片。而notify()则是随机使所有处于wait状态线程的其中之一进入ready状态,当可以执行时获取CPU的时间片,剩下的处于wait状态的线程仍然处于wait状态。 来源: oschina 链接: https://my.oschina.net/u/2314763/blog/737120