黑马程序员技术交流社区

标题: 老师刚刚面了我一题编程题,求解!! [打印本页]

作者: 依然如故    时间: 2014-9-11 10:11
标题: 老师刚刚面了我一题编程题,求解!!
声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。



作者: 八零、玖羚    时间: 2014-9-11 11:15
话说楼主的结果如何?
作者: 马嘉    时间: 2014-9-11 11:24
楼主考了多少分呀
作者: java_dream    时间: 2014-9-11 11:56
  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. }
复制代码

作者: xiayoutianxia    时间: 2014-9-11 12:12
java_dream 发表于 2014-9-11 11:56

ArrayList 用在哪里?
作者: tommy    时间: 2014-9-11 12:36
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();
        }
}

作者: 依然如故    时间: 2014-9-11 13:48
tommy 发表于 2014-9-11 12:36
package cn.sina.pardon.demo;

import java.util.Random;

这么长吗??
作者: 依然如故    时间: 2014-9-11 13:49
马嘉 发表于 2014-9-11 11:24
楼主考了多少分呀

别提了,都是泪啊!!
作者: tommy    时间: 2014-9-11 13:52
依然如故 发表于 2014-9-11 13:48
这么长吗??

能少一点,不用线程通信就少了。。
你自己把包名改了吧
作者: java_dream    时间: 2014-9-11 14:28
xiayoutianxia 发表于 2014-9-11 12:12
ArrayList 用在哪里?

不好意思,我原来打算用List集合保存数据的,这样会简单些,但楼主的题目是要求是用数组保存的,所以就删掉了List部分的代码
作者: bj_zlh    时间: 2014-9-11 15:01
面试题有这么坑
作者: 沈木生    时间: 2014-9-11 15:06
写不出来怎么办
作者: new999    时间: 2014-9-11 15:14
我觉得要用定时器吧,Timer或者ScheduledThreadPoolExecutor
作者: new999    时间: 2014-9-11 15:18
  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. }
复制代码

作者: 马嘉    时间: 2014-9-11 15:54
tommy 发表于 2014-9-11 12:36
package cn.sina.pardon.demo;

import java.util.Random;

你们都是怎么做到的,心思这么缜密吗,我为什我就想不到呢
作者: tommy    时间: 2014-9-11 16:15
new999 发表于 2014-9-11 15:18

用定时器也是一个方法,代码简单很多
作者: yl82846094    时间: 2014-9-11 16:17
看看!!!!
作者: 刃下心    时间: 2014-9-11 16:26
面试要是都这种题目就跪了
作者: 丸子    时间: 2014-9-11 16:30
java_dream 发表于 2014-9-11 11:56

这个是怎么粘过来的?
作者: 旭辉lin    时间: 2014-9-11 16:46
  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. }
复制代码

作者: tommy    时间: 2014-9-11 16:49
面试是让你写还是说思路?
作者: 旭辉lin    时间: 2014-9-11 16:50
哥们,今天面试我糟糕透了,老师上去面试我的7k面试题,我都5天没准备了,我把大部分精力放在了基础题和加强上了,咱们帖子上也没谁说面试7k题,可好了,一下子把我给问懵了。
作者: 旭辉lin    时间: 2014-9-11 16:56
说思路,思想最重要,老师确实是好,给人的感觉特别好,不会为难我们。
作者: java_dream    时间: 2014-9-11 16:56
丸子 发表于 2014-9-11 16:30
这个是怎么粘过来的?

看图就知道了

QQ截图20140911165533.png (12 KB, 下载次数: 39)

QQ截图20140911165533.png

作者: 丸子    时间: 2014-9-11 16:59
  1. public class Share {

  2.         /**
  3.          * 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。
  4.          * @param args
  5.          * @throws InterruptedException
  6.          */
  7.         public static void main(String[] args) throws InterruptedException {
  8.                 // TODO Auto-generated method stub
  9.                 String[] share=new String[6];
  10.                
  11.                 Thread t1=new Thread(new MyRunb(share));
  12.                 t1.join(100);
  13.                
  14.                 Thread t2=new Thread(new MyRunb(share));
  15.                 t1.start();
  16.                 t2.start();
  17.                 t2.join();
  18.                 for(int x=0;x<6;x++)
  19.                         System.out.println(share[x]);
  20.         }
  21. }
  22. class MyRunb implements Runnable{
  23.     private String[] sh=new String[6];
  24.     public MyRunb(String []sh){
  25.             this.sh=sh;
  26.     }
  27.    
  28.         @Override
  29.         public  void  run() {
  30.                 int temp=0;
  31.                 for(int j=0;j<3;j++)
  32.                         synchronized(sh){
  33.                         for(int i=0;sh[i]!=null;i++)
  34.                                 temp=i+1;
  35.                         sh[temp]=Thread.currentThread().getName()+"添加的第"+(j+1)+"数据";
  36.                         }       
  37.         }
  38. }
复制代码

作者: 旭辉lin    时间: 2014-9-11 17:02
丸子 发表于 2014-9-11 16:30
这个是怎么粘过来的?

发表回复的时候在那个笑脸旁边地方有个<>直接添加就可以了
作者: _Miao    时间: 2014-9-11 17:09
是面试哪个方向呢?android的么?
作者: 丸子    时间: 2014-9-11 18:41
java_dream 发表于 2014-9-11 16:56
看图就知道了

试了一下,挺好的。谢谢
作者: 这个夏天的芬芳    时间: 2014-9-11 19:36
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: 谢建平    时间: 2014-9-12 05:03
规定用数组,不能用集合的   集合不用考虑下标  , 也就不用考虑同步了   考的知识点少了
作者: cherry@cookie    时间: 2014-9-12 07:01
好强大!!
作者: 潘多拉    时间: 2014-9-12 10:12
让线程睡一会不行么
作者: 暴走的小青春丶    时间: 2014-9-13 01:14
楼主最近在干嘛呢
作者: 七年锦·旅行    时间: 2014-9-14 11:05
是面试的笔试题吗?
作者: 刃下心    时间: 2014-9-16 01:00
这个题真心难
作者: 依然如故    时间: 2014-10-10 22:58
暴走的小青春丶 发表于 2014-9-13 01:14
楼主最近在干嘛呢

在黑马上课呢!
作者: limengpiao    时间: 2014-10-10 23:35
丸子 发表于 2014-9-11 16:59

在赋值时你的sh[0]是怎么赋值的
作者: limengpiao    时间: 2014-10-10 23:40
丸子 发表于 2014-9-11 16:59

嘿嘿,看懂了,刚才把for循环的范围看错了,感觉你这种做法比较简单,学习啦
作者: 暴走的小青春丶    时间: 2014-10-11 22:41
依然如故 发表于 2014-10-10 22:58
在黑马上课呢!

恭喜楼主进黑马拉
作者: 依然如故    时间: 2014-10-11 23:00
暴走的小青春丶 发表于 2014-10-11 22:41
恭喜楼主进黑马拉

你们也来了??
作者: 泡沫__opt    时间: 2014-10-19 13:59
学习一下~~
作者: 坚持525    时间: 2014-10-24 20:47
new999 发表于 2014-9-11 15:18

你这代码有点问题吧,没完整的实现题目的要求把,
作者: new999    时间: 2014-10-24 20:56
坚持525 发表于 2014-10-24 20:47
你这代码有点问题吧,没完整的实现题目的要求把,

这都被你发现啦,不错啊。写的时候,没有看清题目,随手写上的
作者: 马嘉    时间: 2014-10-25 11:30
楼主被录取了吗

作者: axing110    时间: 2014-10-28 21:17
晕死我做了一晚上,最后发现不用两个线程之间切换郁闷
作者: yangengjie    时间: 2015-5-21 18:38
这题好像没那么麻烦吧
作者: 明月刀割芳草    时间: 2015-8-6 11:16
旭辉lin 发表于 2014-9-11 16:46

学习了

作者: 水壶vs兔子    时间: 2015-9-9 16:11
本帖最后由 水壶vs兔子 于 2015-9-9 16:18 编辑
  1. import java.util.ArrayList;
  2. import java.util.Random;

  3. /*
  4. * 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。
  5. *
  6. * 思路:
  7. *                 1、创建一个ArrayList集合,准备接收数据
  8. *                 2、创建一个类,继承Runnable接口
  9. *                 3、加同步锁
  10. *                 4、重写run方法
  11. *                         A:用sleep()每隔一段时间才添加数据
  12. *                         B:使用Random类的方法产生随机数
  13. *                 5、try、catch异常(没时间throws也行)
  14. *                 6、遍历添加3个元素到集合中
  15. *                 7、设置两个线程启动的条件
  16. *                         A:for循环控制线程只启动两次
  17. *                         B:if判断到底是启动线程1还是线程2
  18. *                                 a:  n == 1,启动线程1
  19. *                                 b:  n != 1,启动线程2
  20. *                 8、启动线程
  21. *                         A:start()
  22. *                         B:join()
  23. *                 9、将集合toString
  24. *                 10、打印字符串
  25. */

  26. public class Test15_Runnable {
  27.         static ArrayList<Integer> al = new ArrayList<Integer>();

  28.         static class TestRunnable implements Runnable {

  29.                 @Override
  30.                 public synchronized void run() {
  31.                         try {
  32.                                 Thread.sleep(1000);
  33.                         } catch (InterruptedException e) {
  34.                                 e.printStackTrace();
  35.                         }
  36.                         for (int x = 0; x < 3; x++) {
  37.                                 al.add(new Random().nextInt(10));
  38.                         }
  39.                 }

  40.         }

  41.         public static void main(String[] args) throws InterruptedException {
  42.                 TestRunnable tr = new TestRunnable();

  43.                 Thread t1 = new Thread(tr);
  44.                 Thread t2 = new Thread(tr);

  45.                 int n = 1;
  46.                 for (int y = 0; y < 2; y++) {
  47.                         if (n == 1) {
  48.                                 t1.start();
  49.                                 t1.join();
  50.                         } else {
  51.                                 t2.start();
  52.                                 t2.join();
  53.                         }
  54.                         n = 0;
  55.                 }
  56.                
  57.                 //最终版
  58.                 String s = al.toString();
  59.                 System.out.println(s);

  60. //                for (int ii : al) {
  61. //                        System.out.println(ii);
  62. //                }
  63.         }
  64. }
复制代码


感觉这样写好想就可以了吧,不对的地方请大家指正!
作者: an3077458    时间: 2015-9-26 23:58
哈哈哈哈哈哈哈哈
作者: syusouki    时间: 2015-10-9 23:14
tommy 发表于 2014-9-11 12:36
package cn.sina.pardon.demo;

import java.util.Random;

线程还得好好复习下,看不懂了
作者: czwanglei    时间: 2016-4-13 08:49
java_dream 发表于 2014-9-11 11:56

写的很正确。。
作者: 热火程序猿    时间: 2016-7-5 09:05
package com.play;

import java.util.Random;

public class AddArray {

        public static void main(String[] args) {
                Add add = new Add();
                new Thread(add, "线程1 :").start();
                new Thread(add, "线程2 :").start();

        }

}
class Add implements Runnable{
       
        int[] arr = new int[6];
        int i = 0;
        private void addArray(int [] arr){
                while(true){
                        synchronized(new Object()){
                                if(i < 6){
                                        try{
                                                wait(1000);
                                        } catch (InterruptedException e){
                                                e.printStackTrace();
                                        }
                                        arr[i] = new Random().nextInt(6);
                                        System.out.println(Thread.currentThread().getName() + "arr[" + i + "] = " + arr[i]);
                                        i++;
                                        notify();
                                }
                        }
                }
        }
        public synchronized void run(){
                addArray(arr);
        }
}
作者: 热火程序猿    时间: 2016-7-5 09:07
热火程序猿 发表于 2016-7-5 09:05
package com.play;

import java.util.Random;

不知道这个交替打印怎么样,就是有个小毛病,线程停不下来,求大神解答!!!




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