黑马程序员技术交流社区

标题: 给数组中添加数据,每一个线程为数组添加3个数据 [打印本页]

作者: www851903307    时间: 2015-2-25 20:39
标题: 给数组中添加数据,每一个线程为数组添加3个数据
/**
* 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
* 给数组中添加数据,每一个线程为数组添加3个数据即可。
* @author Administrator
*
*/
public class Thread2{
        public static void main(String[] args) {
                String[] share = new String[6];
                Arr t2 = new Arr(share);
                Thread t = new Thread(t2);
                Thread t1 = new Thread(t2);
                t.start();
                t1.start();
               
                for (String string : share) {
                        System.out.println(string);
                }
        }
}
class Arr implements Runnable {
       
        public boolean flag= true;
        private String[] share = new String[6];
       
        public Arr(String[] share) {
                this.share= share;
        }
       
        @Override
        public void run() {
                int num=0;
                synchronized (share) {
                        for (int i = 0; i < 3; i++) {
                                num++;
                                share[num]= Thread.currentThread().getName()+i+"///";
                        }
                        try {
                                Thread.sleep(100);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
        }
}
请教大神,为啥我数组中有三个元素为null。。。应该怎么写



作者: liaohongjie    时间: 2015-2-25 20:45
这个我看看,研究研究!!!!!
作者: fantacyleo    时间: 2015-2-25 20:52
本帖最后由 fantacyleo 于 2015-2-25 20:55 编辑

因为每个线程进入run()运行时,num都从0开始,所以你始终只为share数组的0-2元素赋值,3-5元素始终是null。解决方法之一是把num这个变量拿出来作为静态变量而不是run()的局部变量
作者: wf111sxwf    时间: 2015-2-25 22:12
3楼正解, 还有就是,  你在主线程中 要先将  线程1和线程2执行完 才能执行主线程 要不 你还是会打印出Null来,  提示  :用join方法
作者: sofeel    时间: 2015-2-26 01:31
楼上2位正解。
我改过了代码附上
  1. package pre;

  2. /**
  3. * 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
  4. * 给数组中添加数据,每一个线程为数组添加3个数据即可。
  5. * @author Administrator
  6. *
  7. */
  8. public class Thread2{
  9.                 /*
  10.                  * 两点说明:
  11.                  * 1,有可能:主线程开始打印了,子线程没开始或没执行完。导致有空项。
  12.                  * 2,run方法由两个线程调用,他们的共享数据num应在成员位置。
  13.                  * */
  14.         public static void main(String[] args) {
  15.                 String[] share = new String[6];
  16.                 Arr t2 = new Arr(share);
  17.                 Thread t = new Thread(t2);
  18.                 Thread t1 = new Thread(t2);
  19.                 t.start();
  20.                 t1.start();
  21.                
  22.                 try {
  23.                                         Thread.sleep(100);
  24.                                         //打印
  25.                                         for (String string : share) {
  26.                                System.out.println(string);
  27.                         }
  28.                                 } catch (InterruptedException e) {e.printStackTrace();}
  29.         }
  30. }

  31. class Arr implements Runnable {
  32.         
  33.         public boolean flag= true;
  34.         private String[] share;
  35.         private int num;
  36.         
  37.         public Arr(String[] share) {
  38.                 this.share= share;
  39.         }
  40.         
  41.         @Override
  42.         public void run() {
  43.                
  44.                 synchronized (share) {
  45.                                 //添加
  46.                         for (int i = 0; i < 3; i++) {
  47.                                
  48.                                 share[num++]= Thread.currentThread().getName()+i+"///";
  49.                         }
  50.                         try {
  51.                                 Thread.sleep(100);
  52.                         } catch (InterruptedException e) { e.printStackTrace(); }
  53.                 }
  54.         }
  55. }
复制代码

作者: sofeel    时间: 2015-2-26 01:33
fantacyleo 发表于 2015-2-25 20:52
因为每个线程进入run()运行时,num都从0开始,所以你始终只为share数组的0-2元素赋值,3-5元素始终是null。 ...

static不可取,设为普通成员就行
作者: 万合天宜    时间: 2015-2-26 09:02
将变量设置成共享数据就可以了~加static容易产生安全问题,应该是这样的~
作者: jiangwenjun    时间: 2015-2-26 12:13
你的String[] 每个元素默认为null  你只循环了i<3,当然只给前3个复制了!后面三个都没有改变!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2