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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiexie758 中级黑马   /  2015-10-31 18:02  /  420 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:开启两个线程,每个线程相隔往数组装数据,数组长度为6:

package itcast;

import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo20 {

        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                int [] arr=new int[6];
                ArrayAdd array=new ArrayAdd(arr);
                new Thread(array).start();
                new Thread(array).start();
        }

}
class ArrayAdd implements Runnable
{
        private int[] in;
        private int num=0;
        private Random ra=new Random();
        private ReentrantLock lock=new ReentrantLock();
                Condition con=        lock.newCondition();
        /**
         * @param in
         */
        public ArrayAdd(int[] in) {
                super();
                this.in = in;
        }
        public void run(){
               
                while(num<in.length){//判断添加的数组数量是否小于数组长度
                               
                                lock.lock();//线程拿到锁
                                con.signal();//线程进来后,唤醒其他线程
                                if(num<in.length){
                                       
                                        try {
                                                Thread.sleep(300);
                                        } catch (InterruptedException e) {
                                               
                                                e.printStackTrace();
                                        }
                                        finally{
                                                int a=(ra.nextInt(20)+1);//随机生成的数
                                                in[num]=a;
                                                System.out.println(Thread.currentThread().getName()+":"+a);
                                                num++;
                                                try {
                                                        con.await();//调用await,放弃执行权
                                                } catch (InterruptedException e) {
                                                        // TODO 自动生成的 catch 块
                                                        e.printStackTrace();
                                                }
                                                //lock.unlock();//想了想,这个锁就不用释放了,await已经释放执行权并释放了锁
                                               
                                       
                                        }
                                       
                       
                                }
               
       
                }
        }
       
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马