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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

  2. import java.util.Random;

  3. /**
  4. * 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。
  5. * @author wfq
  6. *
  7. */
  8. public class Test {

  9.         public static void main(String[] args) throws InterruptedException {
  10.                
  11.                 Demo d = new Demo();
  12.                
  13.                 ThreadA t1 = new ThreadA(d);
  14.                 ThreadB t2 = new ThreadB(d);
  15.                
  16.                 t1.start();
  17.                 t2.start();
  18.                
  19.                 t1.join();
  20.                 t2.join();
  21.                
  22.                 d.printArr();
  23.                
  24.         }
  25. }
  26. class Demo{
  27.         private int[] arr = new int[6];
  28.         private int pos;
  29.         private boolean flag;
  30.         Random r = new Random();
  31.         public synchronized void setNum_1() {
  32.                         while(flag){
  33.                                 try{this.wait();}catch (InterruptedException e) {}
  34.                         }
  35.                         arr[pos++] = r.nextInt();
  36.                         System.out.println(Thread.currentThread().getName()+"......"+r.nextInt());
  37.                         flag=true;
  38.                         this.notify();
  39.         }
  40.     public synchronized void setNum_2() {
  41.         
  42.         while(!flag){
  43.                         try{this.wait();}catch (InterruptedException e) {}
  44.         }
  45.         System.out.println(Thread.currentThread().getName()+"......"+r.nextInt());
  46.                 arr[pos++] = r.nextInt();
  47.                 flag=false;
  48.                 this.notify();
  49.         }
  50.     public void printArr() {
  51.                 for (int i : arr) {
  52.                         System.out.print(i);
  53.                 }
  54.         }
  55. }
  56. class ThreadA extends Thread{
  57.         private Demo a;
  58.         public ThreadA(Demo a) {
  59.                 super();
  60.                 this.a = a;
  61.         }
  62.         public void run() {
  63.      for (int i = 0; i < 3; i++) {
  64.              a.setNum_1();
  65.                 }
  66.         }
  67. }

  68. class ThreadB extends Thread{
  69.         private Demo a;
  70.         public ThreadB(Demo a) {
  71.                 super();
  72.                 this.a = a;
  73.         }
  74.     public void run() {
  75.         for (int i = 0; i < 3; i++) {
  76.                 a.setNum_2();
  77.                 }
  78.         }
  79. }
复制代码
感觉难点在于验证向共享数组中添加元素,一般我们选择打印数组,例如在主线程中打印。但是由于是多线程的,主线程可能瞬间执行完,可此时添加线程还未执行,我们很容易误会向共享数组中添加数据失败。其实是打印的时机不对而已。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

6 个回复

倒序浏览
这是面试题么?看看。
回复 使用道具 举报
围观学习一下……
回复 使用道具 举报
zhuchangbao 发表于 2015-4-24 09:57
这是面试题么?看看。

去年有人被面过这个题,大概在其中
回复 使用道具 举报
主线程瞬间执行完毕和其他两个线程有什么关系?只要还有非守护线程存在,程序就还会运行。调用join毫无必要
实现添加的代码也太繁琐了,两个线程完全可以共用一个添加方法,没必要区分_1和_2。这道题其实很简单,只是考察你是否知道运用同步
回复 使用道具 举报
fantacyleo 发表于 2015-4-24 14:04
主线程瞬间执行完毕和其他两个线程有什么关系?只要还有非守护线程存在,程序就还会运行。调用join毫无必要 ...

高度不同,视角不同。像我这种基础阶段的哥们儿怎么提高啊?过来人求指教.....
回复 使用道具 举报
进来学习下经验
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马