多线程访问共享对象和数据的方式

来源:互联网 发布:微信发淘宝链接打不开 编辑:程序博客网 时间:2024/05/22 05:04

今天是128号,很高兴我的技术分终于达到了10分,我知道这代表不了什么,它还不能确保黑马程序员一定能收留我,但这最起码给了我几乎,我会继续努力挣取我的技术分。今天顺便看了下那些已经通过我们黑马程序测试同学的日志,我发现我写的和他们有太大的差别了,甚至可能不能达到我们的要求,所以为了加快能到黑马的日程我把这段时间观看我们的视频教程所做的随堂笔记摘出一部分来做我的学习日志希望我们的老师能够满意:

 

 

                       多线程访问共享对象和数据的方式

如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据(例如买票系统)!

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

1.将共享数据封装在另一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信。

例如:下列代码

package Cn.itcast;

 

public class MutlplayThreadSharedDate3 {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO 自动生成的方法存根

MutlplayThreadSharedDate3 mtsd3=new MutlplayThreadSharedDate3();

ShareDate shardate=mtsd3.new ShareDate();

MyRunnable1 mr1=mtsd3.new MyRunnable1(shardate);

MyRunnable2 mr2=mtsd3.new MyRunnable2(shardate);

for(int i=0;i<5;i++){

new Thread(mr1).start();

new Thread(mr2).start();

}

 

}

class MyRunnable1 implements Runnable{

private ShareDate shardate;

public MyRunnable1(ShareDate shardate){

this.shardate=shardate;

}

public void run(){

shardate.decres();

}

}

class MyRunnable2 implements Runnable{

private ShareDate shardate;

public MyRunnable2(ShareDate shardate){

this.shardate=shardate;

}

public void run(){

shardate.increase();

}

}

class ShareDate{

private int j=0;

public synchronized void decres(){

--j;

System.out.println("线程:"+Thread.currentThread().getName()+"调用方法decres()将数据J减一变为"+j);

}

public synchronized void increase(){

++j;

System.out.println("线程:"+Thread.currentThread().getName()+"调用方法increase()将数据J减一变为"+j);

}

}

 

}

 

 

2.将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。

例如:下列代码

package Cn.itcast;

 

public class MutlplayThreadSharedDate2 {

 

private static SharDate sd;

public static void main(String[] args) {

// TODO 自动生成的方法存根

MutlplayThreadSharedDate2 mtsd=new MutlplayThreadSharedDate2();

 sd=mtsd.new SharDate();

 MyRunnable1 mr1=mtsd.new MyRunnable1();

 MyRunnable2 mr2=mtsd.new MyRunnable2();

 for(int i=0;i<2;i++){

 new Thread(mr1).start();

 new Thread(mr2).start();

 }

 

}

class MyRunnable1 implements Runnable{

@Override

public void run() {

// TODO 自动生成的方法存根

sd.decres();

}

}

class MyRunnable2 implements Runnable{

@Override

public void run() {

// TODO 自动生成的方法存根

sd.increase();

}

}

class SharDate{

private int j=0;

public synchronized void decres(){

--j;

System.out.println("线程:"+Thread.currentThread().getName()+"调用方法decres()将数据J减一变为"+j);

}

public synchronized void increase(){

++j;

System.out.println("线程:"+Thread.currentThread().getName()+"调用方法increase()将数据J减一变为"+j);

}

}

 

}

 

 

 

3.将12结合将共享数据封装在另外一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上完成,对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员变量或局部内部类

总之要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信!

 

原创粉丝点击