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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。


53 个回复

倒序浏览
话说楼主的结果如何?
回复 使用道具 举报
楼主考了多少分呀
回复 使用道具 举报
  1. package com.cai.test;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Random;

  6. public class ThreadTest extends Thread {
  7.         // 数组share索引
  8.         public int index = 0;

  9.         public static void main(String[] args) throws Exception {
  10.                 // share用于保存2个线程添加的数据
  11.                 String[] share = new String[6];
  12.                 ThreadTest tt = new ThreadTest();
  13.                 Thread t1 = new Thread(new AddData(share, tt), "线程A");
  14.                 Thread t2 = new Thread(new AddData(share, tt), "线程B");
  15.                 t1.start();
  16.                 t2.start();

  17.                 // 当2个线程执行完,才执行下面的main线程程序
  18.                 t1.join();
  19.                 t2.join();

  20.                 // 遍历share保存的数据
  21.                 for (int i = 0; i < share.length; i++) {
  22.                         System.out.println(Thread.currentThread().getName() + "--"
  23.                                         + share[i]);
  24.                 }
  25.         }

  26. }

  27. class AddData implements Runnable {

  28.         private String[] share;
  29.         private ThreadTest tt;

  30.         public AddData(String[] share, ThreadTest tt) {
  31.                 this.share = share;
  32.                 this.tt = tt;
  33.         }

  34.         @Override
  35.         public void run() {
  36.                 String[] data = { "第一个数据", "第二个数据", "第三个数据" };
  37.                 synchronized (share) {
  38.                         for (int i = 0; i < data.length; i++) {
  39.                                 try {
  40.                                         Thread.sleep((new Random().nextInt(10) + 1) * 10);
  41.                                 } catch (InterruptedException e) {
  42.                                         e.printStackTrace();
  43.                                 }
  44.                                 this.share[tt.index++] = Thread.currentThread().getName() + ":"
  45.                                                 + data[i];
  46.                         }
  47.                 }
  48.         }
  49. }
复制代码
回复 使用道具 举报

ArrayList 用在哪里?
回复 使用道具 举报
package cn.sina.pardon.demo;

import java.util.Random;

public class Test {

        /*
         * 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
         * 给数组中添加数据,每一个线程为数组添加3个数据即可。
         *
         */
        public static void main(String[] args) {
               
                final ShareArr sharearr = ShareArr.getInstance();
               
                new Thread(new Runnable()
                {
                        public void run()
                        {
                                for(int i = 0;i<3;i++)
                                {
                                        sharearr.addNumFirst();
                                }
                        }
                }).start();
               
               
                new Thread(new Runnable()
                {
                        public void run()
                        {
                                for(int i = 0;i<3;i++)
                                {
                                        sharearr.addNumSecond();
                                }
                        }
                }).start();
        }

}

class ShareArr
{
        private ShareArr(){};
        private static ShareArr arr = null;
        public static ShareArr getInstance()
        {
                if(arr == null)
                {
                        synchronized (ShareArr.class)
                        {
                                if(arr == null)
                                {
                                        arr = new ShareArr();
                                }
                        }
                }
                return arr;
        }
       
        private int[] array = new int[6];
        private int i = 0;
        boolean flag = true;
        public synchronized void addNumFirst()
        {
                while(!flag)
                {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                try {
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
                int num = new Random().nextInt();
                System.out.println(Thread.currentThread().getName()+"给数组第"+(i+1)+"个元素赋值"+num);
                array[i++] = num;
                flag = false;
                this.notify();
        }
       
        public synchronized void addNumSecond()
        {
                while(flag)
                {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                try {
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
                int num = new Random().nextInt();
                System.out.println(Thread.currentThread().getName()+"给数组第"+(i+1)+"个元素赋值"+num);
                array[i++] = num;
                flag = true;
                this.notify();
        }
}
回复 使用道具 举报 1 0
tommy 发表于 2014-9-11 12:36
package cn.sina.pardon.demo;

import java.util.Random;

这么长吗??
回复 使用道具 举报
马嘉 发表于 2014-9-11 11:24
楼主考了多少分呀

别提了,都是泪啊!!
回复 使用道具 举报
tommy 中级黑马 2014-9-11 13:52:06
9#

能少一点,不用线程通信就少了。。
你自己把包名改了吧
回复 使用道具 举报
xiayoutianxia 发表于 2014-9-11 12:12
ArrayList 用在哪里?

不好意思,我原来打算用List集合保存数据的,这样会简单些,但楼主的题目是要求是用数组保存的,所以就删掉了List部分的代码
回复 使用道具 举报
面试题有这么坑
回复 使用道具 举报
沈木生 来自手机 中级黑马 2014-9-11 15:06:52
12#
写不出来怎么办
回复 使用道具 举报
我觉得要用定时器吧,Timer或者ScheduledThreadPoolExecutor
回复 使用道具 举报
  1. package com.test.share;

  2. import java.util.List;
  3. import java.util.Random;
  4. import java.util.concurrent.CopyOnWriteArrayList;
  5. import java.util.concurrent.ScheduledExecutorService;
  6. import java.util.concurrent.ScheduledThreadPoolExecutor;
  7. import java.util.concurrent.TimeUnit;

  8. //声明一个共享数组,起两个线程,
  9. //两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,
  10. //每一个线程为数组添加3个数据即可。
  11. public class ShareArray {
  12.        
  13.        
  14.         private static List<Integer> alist=new CopyOnWriteArrayList<>();

  15.         public static void main(String[] args) {
  16.                 final ScheduledExecutorService timer=new ScheduledThreadPoolExecutor(2);
  17.                 for(int i=0;i<2;i++){
  18.                         timer.scheduleAtFixedRate(new Runnable(){
  19.                                 @Override
  20.                                 public void run() {
  21.                                         for(int i=0;i<3;i++){
  22.                                                 int e=new Random().nextInt();
  23.                                                 alist.add(e);
  24.                                         }
  25.                                         System.out.println(timer+" alist:"+alist);
  26.                                 }
  27.                         }, 3, 3, TimeUnit.SECONDS);
  28.                 }

  29.         }

  30. }
复制代码
回复 使用道具 举报 0 1
tommy 发表于 2014-9-11 12:36
package cn.sina.pardon.demo;

import java.util.Random;

你们都是怎么做到的,心思这么缜密吗,我为什我就想不到呢
回复 使用道具 举报
tommy 中级黑马 2014-9-11 16:15:28
16#

用定时器也是一个方法,代码简单很多
回复 使用道具 举报
yl82846094 来自手机 中级黑马 2014-9-11 16:17:38
17#
看看!!!!
回复 使用道具 举报
面试要是都这种题目就跪了

点评

我就是  发表于 2015-6-11 15:49
回复 使用道具 举报

这个是怎么粘过来的?
回复 使用道具 举报
  1. package bao1;

  2. import java.util.ArrayList;
  3. import java.util.Random;

  4. public class Demo {
  5.         static ArrayList<Integer> al = new ArrayList<Integer>();
  6.         static Object[] obj;
  7.         public static void main(String[] args) throws Exception {
  8.                 RR r = new RR();
  9.                 Thread t1 = new Thread(r);
  10.                 Thread t2 = new Thread(r);
  11.                 int n=1;
  12.                 for (int i = 0; i < 2; i++) {
  13.                         if(n==1){
  14.                                 t1.start();
  15.                                 t1.join();
  16.                         }else{
  17.                                 t2.start();
  18.                                 t2.join();
  19.                         }
  20.                         n=(n+1)%2;
  21.                 }
  22.                 obj = al.toArray();
  23.                 for (int i = 0; i < obj.length; i++) {
  24.                         System.out.println(obj[i]);
  25.                 }
  26.         }

  27.         static class RR implements Runnable {
  28.                 public synchronized void run() {
  29.                         try {
  30.                                 Thread.sleep(1000);
  31.                         } catch (InterruptedException e) {
  32.                                 e.printStackTrace();
  33.                         }
  34.                         for (int i = 0; i < 3; i++) {
  35.                                 al.add(new Random().nextInt(10));
  36.                         }
  37.                 }
  38.         }
  39. }
复制代码
回复 使用道具 举报 1 0
123下一页
您需要登录后才可以回帖 登录 | 加入黑马