欢迎来到天天文库
浏览记录
ID:31022789
大小:79.00 KB
页数:5页
时间:2019-01-05
《多个线程之间共享数据的方式-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、多个线程Z间共厚数据的方式-编程开发技术多个线程之间共享数据的方式原文出处:where一.目标谈到多线程共享数据,理想情况下我们希望做到“同步”和“互斥”。这是口标我们暂且把它先放到这。二分类多线程共享数据通常的场景有一下两种:场景一:卖票,我们都买过火车票。要买火车票我们可以去车站,也可以通过代售点(或网购),但不管冇多少种方式火车票的总数是一定的。场景抽象:对于卖票系统每个线程的核心执行的代码都相同(就是票数-)。解决方法:只需创建一个Runnable,这个Runnable里有那个共享数据。代码模拟:package多线程共享数据;publicclassTicketimple
2、mentsRunnable{privateintticket=10;publicvoidrun(){while(ticket>0){ticket--;System,out.printin("当而票数为:〃+tickct);}}package多线程共享数据;publicclassSellTicket{/***@paramargs*/publicstaticvoidmain(String[]args){Tickett=newTicket();newThread(t).start();newThread(t).start();}}?场景二:比较常见的例子,银行问题,我们对账户可以存钱
3、也可以取钱,怎么保证这样的数据共享呢?场景抽象:每个线程执行的代码不同(比如上而的问题,对每个账户可以执行++操作和-操作),这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable之间的数据共享解决方案:有两种方法来解决此类问题:•将共享数据封装成另外一个对象中封装成另外一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上完成,这样容易实现针对数据进行各个操作的互斥和通信•将Runnable对彖作为偶一个类的内部类,共享数据作为这个类的成员变量,每个线程对共厚数据的操作方法也封装在外部类,以便实
4、现对数据的各个操作的同步和互斥,作为内部类的各个Runnable对象调用外部类的这些方法。代码模拟:以一道而试题为例:“设计4个线程。,其中两个线程每次对j增加1,另外两个线程对j每次减V(第一种解法)publicclassMyData{privateintj二0;publicsynchronizedvoidadd(){j++;System,out.printIn(z,线程,Z+Thread.currentThread()・getName()+"j为:"+j);publicsynchronizedvoiddec(){j一;System,out.printinC线程"+Threa
5、d.currentThread().getName()+"j为:〃+j);}publicintgetData(){returnj;}}publicclassAddRurrnableimplcmcntsRurrnable{MyDatadata;publicAddRunnable(MyDatadata){this,data二data;}publicvoidrun(){data..add();publicclassDecRunnableimplementsRunnable{MyDatadata;publicDccRurmable(MyDatadata){this,data=data;
6、}publicvoidrun(){data,dec();测试代码:publicclassTestOne{/***@paramargs*/publicstaticvoidmain(String[]args)MyDatadata=newMyData();Runnableadd=newAddRunnable(data);Runnabledec二newDecRunnable(data);for(inti=0;i<2;i++){newThread(add).start();newThread(dec).start();}}解法分析:优点:1・这种解法代码写的有条理,简单易读,从nmin中
7、很容易整理出思路2.将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以和容易做到同步,只要在方法上加synchronized“不足:代码写的比较繁琐,需要冇多个类,不是那么简洁个人观点:为了有条理个人比较喜欢这种写法。(第二种解法)publicclassMyData{privateintj二0;publicsynchronizedvoidadd(){j++;System,out.printin(v线程/Z+Thread.currentThread()・getName()+
此文档下载收益归作者所有