A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HelloWorld_2013 中级黑马   /  2013-4-13 13:20  /  1474 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HelloWorld_2013 于 2013-4-14 15:56 编辑

多个线程怎样实现数据共享..

点评

建议你多看看毕老师或张老师的视频,看完了你就会理解好多知识点,谢谢  发表于 2013-4-14 14:18

6 个回复

正序浏览
黄玉昆 黑马帝 2013-4-14 14:18:50
7#
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
                   1.编写Runnable接口实现类,并覆盖Runnable接口中的run()方法。run()方法体中放置线程执行代码。

                    2.创建实现类的对象。

                    3.调用Thread类的构造函数,创建Thread类的对象。(调用Thread类的构造函数时,要将第二步中创建的实现类对象作为参数传递给构造函数)

                    4.调用Thread类的对象的start()方法开启线程,线程一旦获得资源后就会执行第一步中run()方法体中的代码。

     示例代码:

                //1.编写Runable接口实现类

        class Demo implements Runnable{

                 //定义一个私有的成员变量

                  private int tick = 100;


                 //覆盖Runnable接口中的run()方法
public void run(){
//编写多线程的执行代码
while(true){
(tick>0){
//Thread.currentThread().getName()——获得当前运行的线程对象的名字。
System.out.println(Thread.currentThread().getName()+"剩余票数"+tick--);
         }
      }
  }
}

         //编写测试类。

       public class Test(){

            public static void main (String[] args){

                  //2.创建实现类对象

                       Demo d= new Demo();

                  //3.调用Thread类的构造函数,创建Thread类的对象(即线程对象)。将实现类对象传递给不同线程对象。使不同线程共享同一个数据。
                        Thread t1 = new Thread(d);

                        Thread t2 = new Thread(d);

                         Thread t3 = new Thread(d);


                   //4.调用Thread类的对象t 的start()方法开启线程

t1.start();
  t2.start();
  t3.start();
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
线程安全问题产生的原因:   多个线程通过多条语句去操作共享数据

哥们你是肿么了。
回复 使用道具 举报
本帖最后由 HM张勇 于 2013-4-13 13:55 编辑

毕老师第12天多线程视频中,将共享数据作为参数传入自定义的函数中,通过函数来调用共享数据。
1,定义共享数据。
2,将共享数据传入自定义函数。
3,通过调用函数达到调用共享数据的功能。
  1. class Res  //------定义共享数据------
  2. {
  3.         String name;
  4.         String sex;
  5. }

  6. class Input implements Runnable
  7. {
  8.         private Res r;
  9.         Input(Res r)//------将共享数据传入函数中------
  10.         {
  11.                 this.r = r;
  12.         }
  13.         public void run()
  14.         {
  15.                 int x = 0;
  16.                 while (true)
  17.                 {
  18.                         synchronized(r)
  19.                         {
  20.                                 if (x == 0)
  21.                                 {
  22.                                         r.name = "mike";
  23.                                         r.sex = "man";
  24.                                 }
  25.                                 else
  26.                                 {
  27.                                         r.name = "丽丽";
  28.                                         r.sex = "女女女女女女";
  29.                                 }
  30.                                 x = (x + 1)%2;
  31.                         }
  32.                 }
  33.        
  34.         }
  35. }

  36. class Output implements Runnable
  37. {
  38.         private Res r ;
  39.         Output(Res r)//------将共享数据传入函数中------
  40.         {
  41.                 this.r = r;
  42.         }
  43.         public void run()
  44.         {
  45.                 while (true)
  46.                 {
  47.                         synchronized(r)
  48.                         {
  49.                                 System.out.println(r.name+"..."+r.sex);
  50.                         }
  51.                 }
  52.         }
  53. }

  54. class InputOutputDemo
  55. {
  56.         public static void main(String[] args)
  57.         {
  58.                 Res r = new Res();

  59.                 Input in = new Input(r);//------调用共享函数------
  60.                 Output out = new Output(r);//------调用共享函数------

  61.                 Thread t1 = new Thread(in);
  62.                 Thread t2 = new Thread(out);

  63.                 t1.start();
  64.                 t2.start();

  65.         }
  66. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这个分两种情况说:
一、如果多个线程共享某个数据,线程的run()方法执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中存放共享的数据。然后使用Thread类传递Runnable对象创建若干个线程,这样可以实现多个线程共享某个数据。
二、如果多个线程共享某个数据,线程的run()方法执行的代码不同
A,那么可以定义一个类,将共享数据封装到这个对象中;然后,实现多个Runnable(至少两个),把定义的这个类的对象传递 给Runnable子类的构造函数,每个线程对共享数据的操作也定义在这个定义的类中,这样可以方便的实现对这个共享数据的互斥和同步。这种方法可以参见毕老师讲解的线程同步中的生产者和消费者的例子。毕老师先定义了一个资源类,然后定义两个实现Runable接口的生产者和消费者,对于共享资源的操作也定义在了生产者和消费者中。然后主函数中通过传递对应的Runnable对象创建Thread对象,从而实现了不同线程对共享数据的不同操作。

B,还可以通过内部类实现。将Runnable对象作为某一个类的内部类,把共享的资源作为这个外部类的成员变量,每个线程对共享数据的操作方法也分配给外部类,方便实现共享数据进行的各个操作的互斥与同步,作为外部类的各个Runnable对象调用外部类的这些方法。


另外:我们在学习static关键字时候,静态有个特点:被静态修饰的成员可以被所有的对象所共享,所以可以简单方便的把需要共享的数据定义为静态。例如,在毕老师讲解直接通过Thread类创建线程时演示卖火车票的例子,刚开始i就是把火车票定义为了静态,然后引入了通过Runnable创建线程的方式。需要说的是:一般我们不通过静态实现线程对数据的共享。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
加个锁....
或者管道...
继承Runabl
然后用Thread(new Runable()).start();指向同一个目标
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马