设为首页 加入收藏

TOP

Java多个线程之间处理共享数据的方式
2015-02-02 14:36:54 来源: 作者: 【 】 浏览:8
Tags:Java 多个 线程 之间 处理 共享 数据 方式

题目要求:


有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?


分析:


x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。


所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。


如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:


第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个


对象完成,这样就可以实现对该数据处理的互斥与通信。


class ShareData {
?private int x = 0;


?public synchronized void addx(){
?
? ?x++;
? ?System.out.println("x++ : "+x);
?
?}
?public synchronized void subx(){
?
? ?x--;
? ?System.out.println("x-- : "+x);
? ?
?}
}
class MyRunnable1 implements Runnable{
?private ShareData share1 = null;
?public MyRunnable1(ShareData share1) {
? this.share1 = share1;
?
?}
?public void run() {
? for(int i = 0;i<100;i++){
? share1.addx();
? }
?}
}
class MyRunnable2 implements Runnable{
?private ShareData share2 = null;
?public MyRunnable2(ShareData share2) {
? this.share2 = share2;
?
?}
?public void run() {
? for(int i = 0;i<100;i++){
? share2.subx();
? }
?}
}
public class ThreadsVisitData {


?
?public static void main(String[] args) {
? ShareData share = new ShareData();
? new Thread(new MyRunnable1(share)).start();
? new Thread(new MyRunnable2(share)).start();
?
?}
}


第二种:


将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作


class ShareData {
?private int x = 0;


?public synchronized void addx(){
? ?x++;
? ?System.out.println("x++ : "+x);
?}
?public synchronized void subx(){
? ?x--;
? ?System.out.println("x-- : "+x);
?}
}


public class ThreadsVisitData {


? public static ShareData share = new ShareData();
?
?public static void main(String[] args) {
? //final ShareData share = new ShareData();
? new Thread(new Runnable() {
?
? ?public void run() {
? ? for(int i = 0;i<100;i++){
? ? share.addx();
? ? }
? ?}
? ?}).start();
? new Thread(new Runnable() {
?
? ? public void run() {
? ? ?for(int i = 0;i<100;i++){
? ? ?share.subx();
? ? ?}
? ? }
? ?}).start();
?}
}


总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何使用jQuery的validate 下一篇Java线程范围内的共享数据

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: