- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
注意: (1) wait()、 notify()和notifyAll()都是Object类中的方法,而不是Thread类中的方法。 (2)wait()、 notify()和notifyAll()方法只能在锁定(用synchronized修饰)的程序或语句块中使用,否则会产生编译异常。 (3)当线程(Consumer)调用对象(Stack)的wait()方法时,就把这个线程加到该对象的等待线程队列中。当另一个线程(Produce)调用同一对象(Stack)的notify()方法时,对象会唤醒其等待线程队列中的一个线程(Consumer) ,允许它继续运行。 Java的线程调度并不是严格按照优先级顺序的,他只是保证优先级高的线程得到时间片的机会更大一些。 实际编程时,不建议使用线程的优先级来确保算法的正确执行。要编写正确、跨平台的多线程代码,必须假设线程在任何时刻都有可能被剥夺CPU资源的使用权。 15 public synchronized Goods get() { 16 while(index == 0) {//缓冲区空 17 try { 18 this.wait(); //没有资源,等待 19 } catch (InterruptedException e) { } 20 } 21 index--; //资源个数减1 22 this.notify();//缓冲区有空间,生产者可以生产了 23 return buffer[index]; 24 } 25 } 1 class Producer implements Runnable {//生产者线程 2 private Stack s = null; 3 public Producer(Stack s) { this.s = s; } 4 Random random = new 5 Random(System.currentTimeMillis()); 6 public void run() { 7 for(;;) { Goods goodID = new Goods(random.nextInt(100)); s.put(goodID); //生产资源 10 System.out.println(生产: + goodID); 11 try { Thread.sleep(100); 12 } catch (InterruptedException e) { } 13 } 14 } 15 } 1 class Consumer implements Runnable {//消费者线程 2 private Stack s = null; 3 public Consumer(Stack s) { this.s = s; } 4 public void run() { 5 for(;;) { 6 Goods goodID = s.get();//消费资源 7 System.out.println(消费: + goodID); 8 try { 9 Thread.sleep(200); 10 } catch (InterruptedException e) { } 11 } 12 } 13} 1 public class ProducerConsumer { 2 public static void main(String[]args) { 3 Stack s = new Stack(); 4 Producer p = new Producer(s); 5 Consumer c = new Consumer(s); 6 new Thread(p).start(); //启动生产者线程 7 new Thread(c).start(); //启动消费者线程 8 } 9 } 线程优先级 线程的优先级从低到高1~10表示。默认情况下,优先级为5
文档评论(0)