java_base4的_thread.ppt

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
java_base4的_thread

线程通信 假定线程t1和线程t2共同操纵一个对象s,这两个线程可以通过对象s的wait()和notify()方法来进行的通信。 S 对象 method1() t1 t2 method2() 生产者与消费者线程通信 class Stack { … public synchronized String pop() { this.notifyAll(); while(point==-1){ System.out.println(Thread.currentThread().getName()+: wait); try{ this.wait(); }catch(InterruptedException e){throw new RuntimeException(e);} } String goods = buffer[point]; buffer[point]=null; Thread.yield(); point--; return goods; } public synchronized void push(String goods) { …} } 参见mythread\newproblem\SyncTest.java 生产者与消费者线程通信 class Stack { … public synchronized void push(String goods) { this.notifyAll(); while(point==buffer.length-1){ System.out.println(Thread.currentThread().getName()+: wait); try{ this.wait(); }catch(InterruptedException e){throw new RuntimeException(e);} } point++; Thread.yield(); buffer[point]=goods; } } 生产者与消费者线程通信 public class SyncTest { public static void main(String args[]) { Stack stack1 = new Stack(stack1); Producer producer1 = new Producer(stack1,producer1); Consumer consumer1 = new Consumer(stack1,consumer1); Consumer consumer2 = new Consumer(stack1,consumer2); } } 生产者与消费者线程通信 对于stack1,同时有两个消费者取出产品,只有一个生产者加入产品,因此有可能导致消费者取产品时堆栈为空的情况。以下是consumer2线程取产品时可能出现的流程。 (1)执行this.notifyAll()方法,此时this引用的stack1对象的等待池中没有任何线程,因此该方法什么也不做。 (2)由于point为-1,因此执行this.wait()方法,consumer2线程释放stack1对象的锁,并且进入stack1对象的等待池。 (3)producer1线程获得stack1对象的锁,开始执行push()方法。 (4)producer1线程首先执行this.notifyAll()方法,此时this引用的stack1对象的等待池中有一个consumer2线程,因此把这个线程转到stack1对象的锁池。 (5)producer1线程判断point不为buffer.length-1,无需执行this.wait()方法,producer1线程向堆栈中加入一个产品,然后退出push()方法,并且释放锁。 (6)在stack1对象的锁池中的consumer2线程获得了锁,转到就绪状态,只要获得了CPU,就能继续执行pop()方法。 终止线程 当线程执行完run()方法,它将自然终止运行。 Thread有一个stop()方法,可以强制结束线程,但这种方法是不安全的。因此,在JDK1.2开始的版本中,stop()方法已经被废弃。 实际编程中,一般是定义一个标志变量,然后通过程序来改变标志变量的值,从而控制线程从run()方法中自然退出。 参见MyThreadStop.java 终止线程 publ

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档