- 1、本文档共13页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java中线程间通信线程间通信(通讯): 多个线程在处理同一个资源,但任务不同。一、 等待/唤醒机制:涉及的方法:(1) wait(); 使线程处于冻结状态,被wait的线程会存储到线程池(等待集)中;(2) notify(); 唤醒线程池中的一个线程,这个线程是任意的;(3) notifyAll(); 唤醒线程池中的所有线程。 这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法;而且必须要明确到底操作的是哪个锁上的线程。即必须明确线程由那个监视器监视。 监视器: 就是所说的锁。为什么操作线程的方法wait()、notify()、notifyAll()定义在了Object类中?答:因为这些方法就是监视器的方法,监视器就是锁,锁可以是任意的对象,如 Object obj = new Object();既然可以是任意对象,那么这些方法需要定义在最高的类中,即定义在Object类中。线程间通信的示例://创建一个资源类 ,存放资源class Resource { private String name; private String sex; private boolean flag = false; public synchronized void input(String name, String sex) {if (flag) try {this.wait(); } catch (InterruptedException e) { }this.name = name;this.sex = sex;flag = true;this.notify(); } public synchronized void output() {if (!flag) try {this.wait(); } catch (InterruptedException e) { }System.out.println(name + 的性别: + sex);flag = false;this.notify(); }}//创建输入的run方法,利用类对任务进行封装class Input implements Runnable { Resource r = null; Input(Resource r) {this.r = r; } public void run() {int x = 0;for (int i = 10; i 0; i--) { if (x == 0)r.input(KangKang, 男); elser.input(Jane, 女); x = (x + 1) % 2;} }}//利用类实现对输出任务的封装class Output implements Runnable { Resource r = null; Output(Resource r) {this.r = r; } public void run() {for (int i = 10; i 0; i--) r.output(); }}//主方法所在的类public class ThreadCommunication { public static void main(String[] args) {Resource r = new Resource();//创建一个资源对象,使下面两个线程同时操作同一个资源对象Input in = new Input(r);Output out = new Output(r);Thread tin = new Thread(in);Thread tout = new Thread(out);tin.start();tout.start(); }}结果:(实现一次赋值,一次输出,两个线程交替进行)KangKang 的性别: 男Jane 的性别: 女KangKang 的性别: 男Jane 的性别: 女KangKang 的性别: 男Jane 的性别: 女KangKang 的性别: 男Jane 的性别: 女KangKang 的性别: 男Jane 的性别: 女生产者—消费者模式:单生产者—单消费者模式:class Resource1 { private int count = 0;// 生产物品编号 private String name; private boolean flag = false; public synchronized void produce(String name) { this.name = name;if (flag) try {this.wait(); } catch (InterruptedException e) { }this.count++;System.out.println(生产的 + thi
文档评论(0)