notify 和wait 2

本文介绍了一个使用Java实现的多线程生产者-消费者模型的例子。通过将休眠操作放置于同步块之外来提高程序执行效率,并展示了如何确保单个线程的异常不影响其他线程。代码包括Product和Consume两个类,分别代表生产者和消费者。

1. 在这个例子中,休眠(Thread.sleep())被放在同步语句之外,因而程序有较高的执行效率。

在前一个例子中,sleep()放在同步语句之内,使得只有一个线程的synchnoize块执行完,才能执行其他的线程同步块,因而效率非常低

2. 单个线程的异常不会影响其他的线程

类Product.java

import java.util.List; /** * @author Administrator * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class Product implements Runnable { private List container = null; private int count; public Product(List lst) { this.container = lst; } public void run() { while (true) { System.out.println("container.size()=" + container.size() + "," + Thread.currentThread().getThreadGroup().activeCount() + "," + Thread.activeCount()); // Thread[] threads = new Thread[Thread.activeCount()]; // Thread.enumerate(threads); // // for (int j = 0; j < threads.length; j++) { // StackTraceElement[] ste = threads[j].getStackTrace(); // for (int i = 0; i < ste.length; i++) { // System.out.println(threads[j].getName() + ste[i]); // } // } synchronized (container) { if (container.size() > MultiThread.MAX) { try { System.out.println("Exceed the MAX limit."); container.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ container.add(new Object()); container.notify(); //自动通知,快速生产 System.out.println("我生产了" + (++count) + "个"); } //container.add(new Object()); //container.notify(); //System.out.println("我生产了" + (++count) + "个"); } // try { // Thread.sleep(10); // } catch (InterruptedException e) { // e.printStackTrace(); // } } } }

类Consume.java

import java.util.List; /** * @author Administrator * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class Consume implements Runnable { private List container = null; private int count; private String flag = "test is ok"; public Consume(List lst) { this.container = lst; } public void run() { while (true) { synchronized (container) { // if (container.size() == 0) { // try { // System.out.println("container.size=0"); // container.wait();//放弃锁 // } catch (InterruptedException e) { // e.printStackTrace(); // } // }else{ // container.remove(0); // //container.notify(); // System.out.println("我吃了" + (++count) + "个"); // } if(container.size() > 0){ container.remove(0); // //container.notify(); System.out.println(Thread.currentThread().getId() + "我吃了" + (++count) + "个,还剩" + container.size()); }else{ container.notify(); } //container.remove(0); //container.notify(); //System.out.println("我吃了" + (++count) + "个"); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

类MultiThread.java

import java.util.ArrayList; import java.util.List; public class MultiThread { private List container = new ArrayList(); public final static int MAX = 5; public static void main(String args[]) { MultiThread m = new MultiThread(); new Thread(new Consume(m.getContainer())).start(); new Thread(new Product(m.getContainer())).start(); new Thread(new Consume(m.getContainer())).start(); //new Thread(new Product(m.getContainer())).start(); } public List getContainer() { return container; } public void setContainer(List container) { this.container = container; } }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值