java线程通信

用输入和输出两个线程对同一对象进行操作

 1 package javase;
 2
 3 class Resource{
 4     String name;
 5     String sex;
 6     boolean flag;
 7 }
 8
 9 class Output implements Runnable{
10
11     Resource r;
12     public Output(Resource r) {
13         super();
14         this.r = r;
15     }
16
17     @Override
18     public void run() {
19
20         r.flag = true;
21         while(true) {
22
23             synchronized (r) {
24                 if(r.flag) {
25                     System.out.println(r.name+"------"+r.sex);
26                     r.flag = false;
27                     r.notify();
28                 }
29                 try {
30                     r.wait();
31                 } catch (InterruptedException e) {
32                     e.printStackTrace();
33                 }
34
35             }
36         }
37
38     }
39
40 }
41
42 class Input implements Runnable{
43
44     private int x=0;
45     Resource r;
46     public Input(Resource r) {
47         super();
48         this.r = r;
49     }
50
51     @Override
52     public void run() {
53
54         r.flag = false;
55         while(true) {
56
57             synchronized (r) {
58                 if(r.flag)
59                     try {
60                         r.wait();
61                     } catch (InterruptedException e) {
62                         e.printStackTrace();
63                     }
64                 if(x%2==0) {
65                     r.name = "佩奇";
66                     r.sex = "母猪";
67                 }
68                 else {
69                     r.name = "乔治";
70                     r.sex = "公猪";
71                 }
72                 x++;
73                 r.flag = true;
74                 r.notify();
75             }
76
77         }
78
79     }
80
81 }
82
83 public class ResourceDemo {
84
85     public static void main(String[] args) {
86
87         Resource r = new Resource();
88         Input in = new Input(r);
89         Output out = new Output(r);
90
91         Thread t1 = new Thread(in);
92         Thread t2 = new Thread(out);
93
94         t1.start();
95         t2.start();
96
97     }
98
99 }

创建一个公用的对象给两个线程使用,一个为输入,一个为输出。当输入线程进入锁后会对对象元素进行赋值,唤醒锁对象线程池中的任意一个线程,然后使自己进入等待。此时输出线程拿到执行权,输出对象元素的值,再唤醒锁对象线程池中的任意一个线程,然后使自己进入等待。如此不断循环即可

原文地址:https://www.cnblogs.com/lsy-lsy/p/10921738.html

时间: 2024-11-05 15:58:18

java线程通信的相关文章

java 线程通信

java 线程通信使用wait notify 配合synchronized 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态.当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 如下代码: public class ThreadTest { //声明一个线程可视化的list集合 public static List<String> lis

Java线程通信——wait() 和 notify()

Object类中有关线程通信的方法有两个notify方法和三个wait方法,官方解释: void notify() Wakes up a single thread that is waiting on this object's monitor. void notifyAll() Wakes up all threads that are waiting on this object's monitor. String toString() Returns a string represent

Java线程通信-生产者消费者问题

线程通信示例--生产者消费者问题 这类问题描述了一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费.假设仓库中没有产品,则生产者可以将 产品放入仓库,有产品,则停止生产并等待,直到仓库中的产品被消费这取走为止. 如果仓库中放油产品,则消费者可以将产品取走消费,否则停止消费并等待,直到 仓库中再次放入产品为止. 显然,这是一个同步问题,生产者和消费这共享同一资源, 并且生产者和消费这之间彼此依赖,互为条件向前推进.Java提供了3个方法解决了线程间的

JAVA线程通信之生产者与消费者

package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock; public class FactoryUtils { private Resource resource; private int producerId = 1; // 可重入锁 ReentrantLock lock = new ReentrantLock()

Java多线程编程核心技术读书笔记(3)-线程通信

线程是操作系统中独立的个体,但是这些个体如果无法经过特殊的处理就不能成为一个整体.线程间通信可以实现线程间的信息互换.相互唤起等功能,是系统的交互性更加强大,大大提高CPU的利用率,同时还能让开发者对各个线程任务有清晰的把控和监督,最常用的线程通信方法就是--等待/通知机制. 一.等待/通知机制 1.wait() / notify() 等待/通知机制在生活中比比皆是,例如:厨师/服务员的菜品传递台.生产者/消费者模式,JDK中通过Object里面的两个方法 wait() / notify() 来

java多线程 - 线程通信

当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但是可以通过一些机制来保证线程协调运行. 由同步监视器对象协调线程 实现这种功能可以借助于Object类提供的wait().notify().notifyAll()三个方法(注意,这三个方法属于Object类,不属于Thread类).这三个方法必须由同步监视器来调用,可以分为两种情况: 对于同步方法,同步监视器默认是当前实例(this),所以可以在同步方法中直接调用这三个方法: 对于同步代码块,同步监视器是synchronized后括号里

java笔记--关于线程通信

关于线程通信 使用多线程编程的一个重要原因就是线程间通信的代价比较小 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.html "谢谢-- 关键技术: yield(): Thread类的一个静态方法,用来暂停当前正在执行的线程对象,并执行其他线程 public static void yield(){} 代码实例: 实现线程间的发送和接收消息 package com.xhj.thread; /** * 线程之间的通信

Java——线程间通信问题

 wait和sleep区别: 1.wait可以指定时间可以不指定.     sleep必须指定时间. 2.在同步时,对cpu的执行权和锁的处理不同.     wait:释放执行权,释放锁.     sleep:释放执行权,不释放锁. /* * 等待/唤醒机制 * 设计的方法: * 1.wait():让线程处于等待状态,被wait的线程会被存储到线程池中. * 2.notify():唤醒线程池中的一个线程(任意) * 3.notifyAll():唤醒线程池中的所有线程. * 这些方法都必须定义

Java线程(九):Condition-线程通信更高效的方式

原文:http://blog.csdn.net/ghsau/article/details/7481142 接近一周没更新<Java线程>专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信. 那么引入本篇的主角,Condition,Condition