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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xclyijin 中级黑马   /  2015-7-27 17:11  /  484 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天积极备战面试,可是网上搜索完面试题后我奔溃了。。。。好像还挺难。
这是其中一道,我想了很久,如果是真的面试,估计就挂了。。。。。。。。
声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
     给数组中添加数据,每一个线程为数组添加3个数据即可。

2 个回复

倒序浏览
  1. import java.lang.reflect.Array;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.Random;
  6. import java.util.concurrent.CopyOnWriteArrayList;
  7. import java.util.concurrent.Executor;
  8. import java.util.concurrent.Executors;
  9. import java.util.concurrent.ScheduledExecutorService;
  10. import java.util.concurrent.ScheduledThreadPoolExecutor;
  11. import java.util.concurrent.TimeUnit;

  12. //声明一个共享数组,起两个线程,
  13. //两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,
  14. //每一个线程为数组添加3个数据即可。
  15. public class Test21 {
  16.         //写一个类实现Runnable接口,创建两个Thread对象传入该类
  17.            //多线程操作共享数组需要同步synchronize
  18.        public static void main(String...args){
  19.                fillArray fa = new fillArray();
  20.                Thread t1 = new Thread(fa);
  21.                Thread t2 = new Thread(fa);
  22.                t1.start();
  23.                t2.start();
  24.        }
  25. }
  26. class fillArray implements Runnable{
  27.     //定义共享数组
  28.         int[] arr = new int[6];
  29.     Random r = new Random();
  30.     int count = 0;
  31.         public void run() {
  32.                 // 同步代码块
  33.                 synchronized(r){
  34.                         while(count<arr.length){
  35.                                 int num = r.nextInt(20);
  36.                                 System.out.println(Thread.currentThread().getName()+"向数组中加入了"+num);
  37.                                 arr[count] = num;
  38.                                 count++;
  39.                                 try {
  40.                                         r.wait(500);
  41.                                 } catch (Exception e) {
  42.                                         e.printStackTrace();
  43.                                 }
  44.                         }
  45.                 }
  46.                 System.out.println(Arrays.toString(arr));
  47.         }
  48.        
  49. }
复制代码
回复 使用道具 举报
我写的好麻烦,不知道谁有简便算法
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                 Res res = new Res();
  4.                 new Thread(new MyThread1(res)).start();
  5.                 new Thread(new MyThread2(res)).start();

  6.         }

  7. }

  8. class Res {
  9.         private int arr[] = new int[10];
  10.         private int index = 0;
  11.         private boolean flag = true;

  12.         public boolean isFlag() {
  13.                 return flag;
  14.         }

  15.         public void setFlag(boolean flag) {
  16.                 this.flag = flag;
  17.         }

  18.         public synchronized void add1() {
  19.                 if (flag) {
  20.                         try {
  21.                                 wait();
  22.                         } catch (InterruptedException e) {
  23.                                 e.printStackTrace();
  24.                         }
  25.                 }
  26.                 arr[index] = (int) (Math.random() * 10);
  27.                 System.out.println(Thread.currentThread().getName() + ":" + arr[index]);
  28.                 index++;
  29.                 setFlag(!flag);
  30.                 notify();

  31.         }

  32.         public synchronized void add2() {
  33.                 if (!flag) {
  34.                         try {
  35.                                 wait();
  36.                         } catch (InterruptedException e) {
  37.                                 e.printStackTrace();
  38.                         }
  39.                 }
  40.                 arr[index] = (int) (Math.random() * 10);
  41.                 System.out.println(Thread.currentThread().getName() + ":" + arr[index]);
  42.                 index++;
  43.                 setFlag(!flag);
  44.                 notify();

  45.         }
  46. }

  47. class MyThread1 implements Runnable {
  48.         private Res res;
  49.         private int count = 0;

  50.         public MyThread1(Res res) {
  51.                 this.res = res;
  52.         }

  53.         @Override
  54.         public void run() {
  55.                 while (count < 3) {
  56.                         res.add1();
  57.                         count++;
  58.                 }
  59.         }

  60. }

  61. class MyThread2 implements Runnable {
  62.         private Res res;
  63.         private int count = 0;

  64.         public MyThread2(Res res) {
  65.                 this.res = res;
  66.         }

  67.         @Override
  68.         public void run() {
  69.                 while (count < 3) {

  70.                         res.add2();
  71.                         count++;
  72.                 }
  73.         }
  74. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马