黑马程序员技术交流社区

标题: 一个面试编程题,看之前有人发的,感觉好拖沓,求解 [打印本页]

作者: 汤汤微微    时间: 2015-1-4 13:04
标题: 一个面试编程题,看之前有人发的,感觉好拖沓,求解
声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可(最好实现两个线程交替添加,不要用基础中没学过的内容),谢谢大家了
作者: jant60    时间: 2015-1-4 13:36
可以用锁 lock,或者synchronized 线程里面run方法  每次循环给数组副三次值就行了
作者: godmmm    时间: 2015-1-4 14:19
没写注释,自己看看吧,我也捣鼓了好久才弄懂的。
  1. import java.util.Random;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;

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

  6. public class TwoThreadToArray {
  7.         public static void main(String[] args) {
  8.                 final Rec2 r=new Rec2();
  9.                 Thread t1=new Thread(new Runnable(){
  10.                         public void run()
  11.                         {
  12.                                 for(int x=0;x<3;x++)
  13.                                 {
  14.                                         r.addFirst(x,r.num++);
  15.                                 }
  16.                         }
  17.                 },"w1");
  18.                
  19.                 Thread t2=new Thread(new Runnable(){
  20.                         public void run()
  21.                         {
  22.                                 for(int x=0;x<3;x++)
  23.                                 {
  24.                                         r.addSecond(x,r.num++);
  25.                                 }
  26.                         }
  27.                 },"w2");
  28.                 t1.start();
  29.                 t2.start();
  30.                
  31.                 try {t1.join();        } catch (InterruptedException e) {e.printStackTrace();}
  32.                 try {t2.join();        } catch (InterruptedException e) {e.printStackTrace();}
  33.                 System.out.println("--------------");
  34.                 for(int i=0;i<r.arr.length;i++)
  35.                 {
  36.                         System.out.println("arr["+i+"]="+r.arr[i]);
  37.                 }
  38.         }
  39.        
  40. }
  41. class Rec2
  42. {
  43.         int[] arr=new int[6];
  44.         boolean flag;
  45.         int num;
  46.         Lock lock=new ReentrantLock();
  47.         Condition conditon_fr=lock.newCondition();
  48.         Condition conditon_se=lock.newCondition();
  49.        
  50.         public  void addFirst(int x,int num) {
  51.                 lock.lock();
  52.                 try{
  53.                         while(flag)
  54.                         {
  55.                                 conditon_fr.await();
  56.                         }
  57.                         Thread.sleep(100);
  58.                         arr[num]=new Random().nextInt(10);
  59.                         System.out.println(Thread.currentThread().getName()+"first--"+"arr["+num+"]"+arr[num]);
  60.                         flag=true;
  61.                         conditon_se.signal();
  62.                 }
  63.                 catch(Exception e)
  64.                 {
  65.                        
  66.                 }
  67.                 finally
  68.                 {
  69.                         lock.unlock();
  70.                 }
  71.         }
  72.         public  void addSecond(int x,int num) {
  73.                 lock.lock();
  74.                 try{
  75.                         while(!flag)
  76.                         {
  77.                                 conditon_se.await();
  78.                         }
  79.                         Thread.sleep(100);
  80.                         arr[num]=new Random().nextInt(10);
  81.                         System.out.println(Thread.currentThread().getName()+"second--"+"arr["+num+"]"+arr[num]);
  82.                         flag=false;
  83.                         conditon_fr.signal();
  84.                 }
  85.                 catch(Exception e)
  86.                 {
  87.                        
  88.                 }
  89.                 finally
  90.                 {
  91.                         lock.unlock();
  92.                 }
  93.         }
  94. }
复制代码



作者: addone    时间: 2016-8-25 23:52
public class NewTest4 {

        public static void main(String[] args) {
               
                ResourceType r = new ResourceType();
                ProducerType pro = new ProducerType(r);
                ConsumerType con = new ConsumerType(r);
               
                new Thread(pro, "成产者线程").start();;
                new Thread(con, "消费者线程").start();;
        }

}


class ResourceType{
       
        private int[] arr = new int[3];
        private Random random  = new Random();
        private boolean flag;
       
        Lock lock  = new ReentrantLock();
        Condition pro_condition = lock.newCondition();
        Condition cons_condition = lock.newCondition();
       
       
        public void set(){
                lock.lock();
                while(flag){
                        try {
                                pro_condition.await();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                contorlArr();
                flag = true;
                cons_condition.signal();
                lock.unlock();
               
        }
        public void out(){
                lock.lock();
                while(!flag){
                        try {
                                cons_condition.await();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                contorlArr();
                flag = false;
                pro_condition.signal();
                lock.unlock();
        }
       
       
        public void contorlArr(){
                arr[0]=random.nextInt();
                arr[1]=random.nextInt();
                arr[2]=random.nextInt();
                System.out.println(Thread.currentThread().getName()+"...#####...."+Arrays.toString(arr));
        }
}

class ProducerType implements Runnable{
        private ResourceType r;
        public ProducerType(ResourceType r){
               
                this.r = r;
        }
        @Override
        public void run() {
                while(true)
                r.set();
               
        }
       
}

class ConsumerType implements Runnable{
        private ResourceType r;
        public ConsumerType(ResourceType r){
                this.r = r;
        }
        @Override
        public void run() {
                while(true)
                r.out();
        }
       
}




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