多线程-线程间的通信
来源:互联网 发布:java 获得项目根目录 编辑:程序博客网 时间:2024/05/22 00:54
class Resource{String name;String sex;}//输入class Input implements Runnable{//Resource r = new Resource();操作的应该是同一个资源,所以这么做不合适//应该在外面把对象建立好,分别传入给输入和输出,能接受参数的函数只有两种,一种是普通函数,一种是构造函数//那我们为什么不能,对象一初始化,就有这些资源呢,就像线程一样,线程对象一创建,就要有线程任务。Resource r;//Object obj = new Object();Input(Resource r){this.r = r;}public void run(){while(true){//实现两个,达到间隔切换,好像在输入很多人的名字,既然设计到切换,应该是两种状态,由if语句控制synchronized(r){/*当碰到线程安全的问题的时候,我们会想到使用同步,但是发现同步的时候,并不能解决问题,说明了什么,应该考虑一下,同步的使用前提。并且明确,解决问题的方案是:多个线程,在同一个锁当中。当前语句只是输入线程被同步了,那还有输出线程呢?就是说,我在输入线程执行的时候,你不能够去取这些数据。所以我们需要再同步输出线程*/if(x == 0){r.name = "mike"; r.sex = "nan";)else{r.name = "丽丽";r.sex = "女";}}x = (x + 1)%2; //为了实现x的变化}}}//输出class Output implements Runnable{//Resource r = new Resource();Resource r;//Object obj = new Object();Output(Resource r){this.r = r;}public void run(){while(true){synchronized(r){/*这时候,即使在对输出线程作了同步,仍然会出现线程的安全问题(妖),因为这两个同步代码块 使用的是不同的锁。当然也不能使用this作为锁,因为这是两个不同的类,是两个不同的对象。那可 不可以用静态锁呢? Input.class、Output.class,都是可以的,Resource.class也是可以的, 但杀鸡何必用牛刀呢。 我们注意到,整个过程中,资源r是唯一的,所以锁可以用r,并且同步代码块需要放在while循环里面 输入线程,拿到执行权的时候,不会只执行一次,等执行到一定次数后,执行权到了输出线程,从最后一 次开始输出,所以结果会出现一片一片的输出。 } */System.out.println(r.name+"..."+r.sex);}}}}class ResourceDemo{public static void main(String [] args){//创建资源Resource r = new Resource();//这句代码产生的原因就是,不同的任务需要产生相同的资源//创建任务Input in = new Input(r);Output out = new Output(r);//资源有了,任务有了,应该有路径了//创建线程Thread t1 = new Thread(in);Thread t2 = new Thread(out);//开启线程t1.start();t2.start();}}//执行结果,会出现mike ... 女 的现象。/*分析出现"妖"的原因:已经输入一次的情况下,如mike man,在准备再输入第二次数据的时候,刚输入了丽丽,输出线程就执行了,所以出现了丽丽 man的情况。解决方案:synchronized,将if语句里面的内容加入同步代码块中*/
0 0
- 【多线程】线程间的通信
- 多线程-线程间的通信
- 多线程线程间通信
- Java的多线程-线程间的通信
- 进击的多线程 --- 线程间的通信
- 多线程专题之线程间的通信
- 黑马程序员-多线程--线程间的通信
- iOS开发多线程-线程间的通信
- 【Java多线程】线程间的通信
- Java多线程-线程间的通信
- VC++多线程编程-线程间的通信和线程同步
- 多线程-线程之间的通信
- 多线程与线程间通信
- Java多线程--线程间通信
- day12 多线程-线程间通信
- Java的多线程-线程间的通信(1)
- Java的多线程-线程间的通信(2)
- Java的多线程-线程间的通信(3)
- Stanford Parser使用
- 源码安装nagios-4.2 (centos 6.8)
- springMVC前台时间字符串到后台Date的转换
- 446. Arithmetic Slices II
- Android RecyclerView设计通用Adapter
- 多线程-线程间的通信
- Linux下 ch340 插入后没有/dev/ttyUSB0设备的解决方法
- CentOS自动安装Maven
- MySQL数据库如何解决大数据量存储问题
- LeetCode Algorithms 2. Add Two Numbers 题解
- android 教程
- socket句柄泄漏问题的定位: losf和strace的联合使用!
- SpringMVC对日期类型的转换
- hdu 1042 N!(大数*小数)