当前位置: 首页 > news >正文

肇庆网站优化建设可以做软文的网站

肇庆网站优化建设,可以做软文的网站,开发公司财务制度,网络物流平台转载自 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例 wait, notify 和 notifyAll#xff0c;这些在多线程中被经常用到的保留关键字#xff0c;在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中…转载自  如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例 wait, notify 和 notifyAll这些在多线程中被经常用到的保留关键字在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子如果你的Java程序中有两个线程——即生产者和消费者那么生产者可以通知消费者让消费者开始消耗数据因为队列缓冲区中有内容待消费不为空。相应的消费者可以通知生产者可以开始生成更多的数据因为当它消耗掉某些数据后缓冲区不再为满。 我们可以利用wait()来让一个线程在某些条件下暂停运行。例如在生产者消费者模型中生产者线程在缓冲区为满的时候消费者在缓冲区为空的时候都应该暂停运行。如果某些线程在等待某些条件触发那当那些条件为真时你可以用 notify 和 notifyAll 来通知那些等待中的线程重新开始运行。不同之处在于notify 仅仅通知一个线程并且我们不知道哪个线程会收到通知然而 notifyAll 会通知所有等待中的线程。换言之如果只有一个线程在等待一个信号灯notify和notifyAll都会通知到这个线程。但如果多个线程在等待这个信号灯那么notify只会通知到其中一个而其它线程并不会收到任何通知而notifyAll会唤醒所有等待中的线程。 在这篇文章中你将会学到如何使用 wait、notify 和 notifyAll 来实现线程间的通信从而解决生产者消费者问题。如果你想要更深入地学习Java中的多线程同步问题我强烈推荐阅读Brian Goetz所著的《Java Concurrency in Practice | Java 并发实践》不读这本书你的 Java 多线程征程就不完整哦这是我最向Java开发者推荐的书之一。 如何使用Wait 尽管关于wait和notify的概念很基础它们也都是Object类的函数但用它们来写代码却并不简单。如果你在面试中让应聘者来手写代码用wait和notify解决生产者消费者问题我几乎可以肯定他们中的大多数都会无所适从或者犯下一些错误例如在错误的地方使用 synchronized 关键词没有对正确的对象使用wait或者没有遵循规范的代码方法。说实话这个问题对于不常使用它们的程序员来说确实令人感觉比较头疼。 第一个问题就是我们怎么在代码里使用wait()呢因为wait()并不是Thread类下的函数我们并不能使用Thread.call()。事实上很多Java程序员都喜欢这么写因为它们习惯了使用Thread.sleep()所以他们会试图使用wait() 来达成相同的目的但很快他们就会发现这并不能顺利解决问题。正确的方法是对在多线程间共享的那个Object来使用wait。在生产者消费者问题中这个共享的Object就是那个缓冲区队列。 第二个问题是既然我们应该在synchronized的函数或是对象里调用wait那哪个对象应该被synchronized呢答案是那个你希望上锁的对象就应该被synchronized即那个在多个线程间被共享的对象。在生产者消费者问题中应该被synchronized的就是那个缓冲区队列。我觉得这里是英文原文有问题……本来那个句末就不应该是问号不然不太通……永远在循环loop里调用 wait 和 notify不是在 If 语句 现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用下一个一定要记住的问题就是你应该永远在while循环而不是if语句中调用wait。因为线程是在某些条件下等待的——在我们的例子里即“如果缓冲区队列是满的话那么生产者线程应该等待”你可能直觉就会写一个if语句。但if语句存在一些微妙的小问题导致即使条件没被满足你的线程你也有可能被错误地唤醒。所以如果你不在线程被唤醒后再次使用while循环检查唤醒条件是否被满足你的程序就有可能会出错——例如在缓冲区为满的时候生产者继续生成数据或者缓冲区为空的时候消费者开始小号数据。所以记住永远在while循环而不是if语句中使用wait我会推荐阅读《Effective Java》这是关于如何正确使用wait和notify的最好的参考资料。 基于以上认知下面这个是使用wait和notify函数的规范代码模板 // The standard idiom for calling the wait method in Java synchronized (sharedObject) {while (condition) {sharedObject.wait();// (Releases lock, and reacquires on wakeup)}// do action based upon condition e.g. take or put into queue } 就像我之前说的一样在while循环里使用wait的目的是在线程被唤醒的前后都持续检查条件是否被满足。如果条件并未改变wait被调用之前notify的唤醒通知就来了那么这个线程并不能保证被唤醒有可能会导致死锁问题。 Java wait(), notify(), notifyAll() 范例 下面我们提供一个使用wait和notify的范例程序。在这个程序里我们使用了上文所述的一些代码规范。我们有两个线程分别名为PRODUCER生产者和CONSUMER消费者他们分别继承了了Producer和Consumer类而Producer和Consumer都继承了Thread类。Producer和Consumer想要实现的代码逻辑都在run()函数内。Main线程开始了生产者和消费者线程并声明了一个LinkedList作为缓冲区队列在Java中LinkedList实现了队列的接口。生产者在无限循环中持续往LinkedList里插入随机整数直到LinkedList满。我们在while(queue.size maxSize)循环语句中检查这个条件。请注意到我们在做这个检查条件之前已经在队列对象上使用了synchronized关键词因而其它线程不能在我们检查条件时改变这个队列。如果队列满了那么PRODUCER线程会在CONSUMER线程消耗掉队列里的任意一个整数并用notify来通知PRODUCER线程之前持续等待。在我们的例子中wait和notify都是使用在同一个共享对象上的。 import java.util.LinkedList; import java.util.Queue; import java.util.Random; /** * Simple Java program to demonstrate How to use wait, notify and notifyAll() * method in Java by solving producer consumer problem. * * author Javin Paul */ public class ProducerConsumerInJava {public static void main(String args[]) {System.out.println(How to use wait and notify method in Java);System.out.println(Solving Producer Consumper Problem);QueueInteger buffer new LinkedList();int maxSize 10;Thread producer new Producer(buffer, maxSize, PRODUCER);Thread consumer new Consumer(buffer, maxSize, CONSUMER);producer.start(); consumer.start(); }}/*** Producer Thread will keep producing values for Consumer* to consumer. It will use wait() method when Queue is full* and use notify() method to send notification to Consumer* Thread.** author WINDOWS 8**/class Producer extends Thread{ private QueueInteger queue;private int maxSize;public Producer(QueueInteger queue, int maxSize, String name){super(name); this.queue queue; this.maxSize maxSize;}Override public void run(){while (true){synchronized (queue) {while (queue.size() maxSize) {try {System.out .println(Queue is full, Producer thread waiting for consumer to take something from queue);queue.wait();} catch (Exception ex) {ex.printStackTrace(); }}Random random new Random();int i random.nextInt();System.out.println(Producing value : i); queue.add(i); queue.notifyAll();}}}}/*** Consumer Thread will consumer values form shared queue.* It will also use wait() method to wait if queue is* empty. It will also use notify method to send* notification to producer thread after consuming values* from queue.** author WINDOWS 8**/class Consumer extends Thread {private QueueInteger queue;private int maxSize;public Consumer(QueueInteger queue, int maxSize, String name){super(name);this.queue queue;this.maxSize maxSize;}Override public void run() {while (true) {synchronized (queue) {while (queue.isEmpty()) {System.out.println(Queue is empty, Consumer thread is waiting for producer thread to put something in queue);try {queue.wait();} catch (Exception ex) {ex.printStackTrace();}}System.out.println(Consuming value : queue.remove()); queue.notifyAll();}}}}为了更好地理解这个程序我建议你在debug模式里跑这个程序。一旦你在debug模式下启动程序它会停止在PRODUCER或者CONSUMER线程上取决于哪个线程占据了CPU。因为两个线程都有wait()的条件它们一定会停止然后你就可以跑这个程序然后看发生什么了很有可能它就会输出我们以上展示的内容。你也可以使用Eclipse里的Step into和Step over按钮来更好地理解多线程间发生的事情。 本文重点 1. 你可以使用wait和notify函数来实现线程间通信。你可以用它们来实现多线程3之间的通信。 2. 永远在synchronized的函数或对象里使用wait、notify和notifyAll不然Java虚拟机会生成 IllegalMonitorStateException。 3. 永远在while循环里而不是if语句下使用wait。这样循环会在线程睡眠前后都检查wait的条件并在条件实际上并未改变的情况下处理唤醒通知。 4. 永远在多线程间共享的对象在生产者消费者模型里即缓冲区队列上使用wait。 5. 基于前文提及的理由更倾向用 notifyAll()而不是 notify()。这是关于Java里如何使用wait, notify和notifyAll的所有重点啦。你应该只在你知道自己要做什么的情况下使用这些函数不然Java里还有很多其它的用来解决同步问题的方案。例如如果你想使用生产者消费者模型的话你也可以使用BlockingQueue它会帮你处理所有的线程安全问题和流程控制。如果你想要某一个线程等待另一个线程做出反馈再继续运行你也可以使用CycliBarrier或者CountDownLatch。如果你只是想保护某一个资源的话你也可以使用Semaphore。
http://wiki.neutronadmin.com/news/299482/

相关文章:

  • seo建站是什么成都微信网站开发
  • 兰州网站设计最佳效果网站不设置关键词描述
  • 门户网站建设的企业长沙专业网站建设公司排名
  • 网站开发什么叫前端后端推广公司哪家好
  • 网盟官方网站新闻头条最新消息摘抄
  • 百度做网站电话多少建设银行官方网站入口
  • 深圳网站建设公司小江WordPress cdn缓存哪些
  • 广东省建设厅官方网站网址中学生在哪里学编程最好
  • 品牌网站设计制作哪家好vultr 搭建wordpress
  • 太原网站制作维护seo网站关键词排名快速
  • 最简单的网站开发软件电子商务网站建设和推广论文
  • 微信生活门户网站源码网页托管网站
  • 珠海教育局系统网站安逸花借款app下载安装
  • 深圳建站网站模板营销网站建设规划
  • 网站服务器和空间的区别全国建筑工程企业资质查询平台
  • 做兼职打字员的网站范县网站建设
  • 廉洁文化网站建设方案手机制作软件下载
  • 杨和网站开发wordpress导航链接地址都是主页
  • 深圳商城网站哪家做的好找人网站 优帮云
  • 做水果网站弄个什么名字温州网站推广优化公司
  • 网站建设与推广论文教你如何在wordpress中设置cookie
  • 手机网站优化别墅装修一般多少钱一套
  • 重庆营销网站建设公司网站建设网络营销平台: 云搜系统
  • 网站前台维护如何做旅游小视频网站
  • 上海建立网站公司云南省建设工程标准定额网站
  • 石家庄设计网站公司茶叶营销策划方案
  • 游戏娱乐网站建设徐州有哪些网站制作公司
  • 成都市建设相关网站国家工商网企业查询官网
  • 怎么做链接网站学习网站建设的书籍
  • 电脑公司网站模板如何修改网站标题