- 浏览: 74533 次
- 性别:
- 来自: 深圳
文章分类
最新评论
/* 线程间通讯: 其实就是多线程在操作同一个资源。 但是操作的动作不同 */ class Res{ String name; String sex; } class Input implements Runnable{ private Res r; Input(Res r){ this.r = r; } public void run(){ int x = 0; while(true){ if(x==0){ r.name = "mike"; r.sex = "man"; } else{ r.name = "哈哈"; r.sex = "女"; } x = (x+1)%2; } } } class Output implements Runnable{ private Res r; Output(Res r){ this.r = r; } public void run(){ while(true){ System.out.println(r.name+"--"+r.sex); } } } class InputOutput{ public static void main(String[] args){ Res r = new Res(); Input in = new Input(r); Output out = new Output(r); Thread t1 = new Thread(in); Thread t2 = new Thread(out); t1.start(); t2.start(); } }
运行结果:
哈哈--man
mike--女
mike--女
mike--女
哈哈--女
mike--女
哈哈--女
mike--女
哈哈--man
哈哈--man
哈哈--man
mike--女
哈哈--女
mike--man
mike--man
mike--man
mike--man
哈哈--女
哈哈--女
————————————————————————————————————
产生该结果原因在于:
两个线程共同操作name和sex,会出现情况是,线程input还没赋值完,output就已经将
变量值输出了。
操作共同资源的代码为
while(true){ if(x==0){ r.name = "mike"; r.sex = "man"; } else{ r.name = "哈哈"; r.sex = "女"; } x = (x+1)%2; }
while(true){ System.out.println(r.name+"--"+r.sex); }
要加上同步。因为当前代码中,只有r对象是唯一的,所以以r为synchronized传递的对象。
/* 线程间通讯: 其实就是多线程在操作同一个资源。 但是操作的动作不同 */ class Res{ String name; String sex; } class Input implements Runnable{ private Res r; Input(Res r){ this.r = r; } public void run(){ int x = 0; while(true){ synchronized(r){ if(x==0){ r.name = "mike"; r.sex = "man"; } else{ r.name = "哈哈"; r.sex = "女"; } x = (x+1)%2; } } } } class Output implements Runnable{ private Res r; Output(Res r){ this.r = r; } public void run(){ while(true){ synchronized(r){ System.out.println(r.name+"--"+r.sex); } } } } class InputOutput{ public static void main(String[] args){ Res r = new Res(); Input in = new Input(r); Output out = new Output(r); Thread t1 = new Thread(in); Thread t2 = new Thread(out); t1.start(); t2.start(); } }
发表评论
-
151多线程(优先级&yield方法)
2015-10-28 11:16 656/* 养成习惯:数据共享用静态 */ class Dem ... -
150_多线程(Join方法)
2015-10-27 18:31 562/* join: 当A线程执行到了B线程的join方法 ... -
114_面向对象(多异常处理)_黑马程序员_Java基础视频
2015-10-25 23:27 657/* 对多异常的处理 1.生命异常时,建议声明更为具体的异 ... -
113_面向对象(异常声明throws)_黑马程序员_Java基础视频
2015-10-25 23:26 445/* 异常:就是程序在运行时出现不正常情况 异常由来:问题 ... -
112_面向对象(异常try-catch)
2015-10-25 23:25 698/* 异常:就是程序在运行时出现不正常情况 异常由来:问题 ... -
148_多线程(停止线程)
2015-10-25 23:16 547/* stop方法已经过时。 如何停止线程? 只有一 ... -
147_多线程(线程间通信-生产者消费者JDK5.0升级版)
2015-10-21 23:33 715/*JDK1.5及以上提供了多线程升级解决方案。 将同步Sy ... -
146_多线程(线程间通信-生产者消费者)
2015-10-20 23:35 595一个生产者一个消费者 ... -
144_多线程(线程间通信-等待唤醒机制)
2015-10-20 18:35 693class Res{ String name; Str ... -
141多线程-死锁
2015-10-20 14:45 650/* 死锁: 同步中嵌套同步 */ class T ... -
140_多线程(多线程-单例设计模式-懒汉式)
2015-10-19 11:45 634/* 单例设计模式 饿汉式 class Single ... -
138_多线程(多线程-同步函数的锁是this)
2015-10-15 14:48 809/* 同步函数用的是哪一个锁呢? 函数需要被对象调用。那么 ... -
137_多线程(多线程-同步函数)
2015-10-13 23:25 569/* 需求:银行有一个金库。 有两个储户分别存300元 ... -
135_多线程(多线程的安全问题)
2015-10-13 18:07 581class TWindow implements Runnab ... -
多线程(创建线程-实现Runnable接口)
2015-10-10 00:19 518class TWindow implements Runnab ... -
133_多线程(售票的例子)
2015-10-09 23:48 598/* 需求:简单的买票程序 多个窗口卖票 */ c ... -
132_多线程(获取线程对象以及名称)
2015-10-09 23:30 1180/* 练习:创建两个线程,和主线程交替运行 线程都有自 ... -
多线程-继承Thread类
2015-10-09 00:26 1522/* 进程:是一个正在执行中的程序 每一个进程执行都有一个 ... -
包的应用
2015-10-08 23:28 1631package pack; class PackageD ... -
异常总结
2015-10-05 20:07 544异常是什么? 是对问题的描述,将问题进行对象的封装。 ...
相关推荐
Java多线程--线程间的通信
多线程的几个例子,例子中有线程的打开,暂停,停止和线程间通信,VC6环境打开并调试。
Java的多线程-线程间的通信.doc
彻底明白Java的多线程-线程间的通信.doc
c++ 多线程编程之三 线程间通讯 后面还有四哦
多线程编程系列。使用事件进行线程间的通讯。一个不错的实例代码。
利用一个小型游戏的服务器和客服端之间的信息通信来介绍多线程之间的信息通信,以及通信可能存在的危险。
python 08、多任务编程多线程 3-1_进程间通信、同步互斥、threading线程_Day03_AM.mp4
对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存...因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。
基于SOCKET和多线程的应用程序间通信技术的研究.pdf
信号同步类CSemaphore通常用于当一个应用程序中同时有多个线程访问一个资源的情况(例如,应用程序允许对同一个Document有多个View);事件同步类CEvent通常用于在应用程序访问资源之前应用程序必须等待的情况(比如,...
采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...
操作系统DOS多任务系统代码 有关时间片轮转、线程间切换、线程间通信、
多线程线程间通信,可用于控制线程内部函数,做处理......................................................
线程间通信的本质和原理,以及Android 中的多线程线程间交互一个线程启动别的线程:new Thread().start()、Executor.execute
利用多线程实现C#中socket网络通信模块,具体最大承受多少个客户端还不是很清楚,但是20个绝对没问题
VC多线程例程七及图解文档(线程间通信) 含源源码
MFC多线程之间的通信:本程序通过2个示例展示了通过自定义消息在多线程之间传递消息。
这个工程简单的演示了如何通过MFC的消息机制来实现多线程间的通信。
第7-10章讲解用于线程同步、线程间通信、进程间通信以及多线程处理的C++组件。第11章讨论C++对象在多线程环境中的行为和交互方式。第12章简单介绍多线程应用程序的测试技术。第13章对全书内容进行扼要地回顾与思考。