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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dsh 中级黑马   /  2014-10-9 12:18  /  2476 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

package heimaTest;

import java.util.Random;

import javax.swing.text.StyledEditorKit.ForegroundAction;
/*
* 2、声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。
*
* 思路:创建两个线程才采用单一的生产/消费机制
*
*/

//创建要操作的数组
class Array{
        int[] arr = new int[6];
        Random r = new Random();
        int i= 0;
        boolean flag = false;
       
        public synchronized void set1() {
                //判断对方是否执行
                if(flag){
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                arr[i]= r.nextInt(100);
                //打印当前线程,获取线程名的方法不会写,以手工代替
                System.out.println("线程1加入.... a["+i+"]=  "+arr[i]);
                i++;
                flag = true;
                notify();
        }
       
        public synchronized void set2(){
                if(!flag){
                        try {
                                wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                arr[i]= r.nextInt(100);
                //打印当前线程
                System.out.println("线程2加入.... a["+i+"]=  "+arr[i]);
                i++;
                flag = false;
                //唤醒对方
                notify();
        }
       
       
       
}
//创建线程1对象
class Thread1 implements Runnable{
        Array a;
        public Thread1(Array a) {
                super();
                this.a = a;
        }


        @Override
        public void run() {
                for (int i = 0; i < 3; i++) {
                       
                        a.set1();
                        //睡眠
                        try {
                                Thread.sleep(300);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
               
        }
       
}

//创建线程2对象
class Thread2 implements Runnable{
       
        Array a;
       
        public Thread2(Array a) {
                super();
                this.a = a;
        }

        @Override
        public void run() {
                for (int i = 0; i < 3; i++) {
                       
                        a.set2();
                        try {
                                Thread.sleep(300);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
        }
       
}

public class Test02 {

        public static void main(String[] args) {
                //创建要操作的数组对象
                Array a = new Array();
                //创建两个线程对象
                Thread1 thread1 = new Thread1(a);
                Thread2 thread2 = new Thread2(a);
               
                //创建两个线程

                Thread t1 = new Thread(thread1);
                Thread t2 = new Thread(thread2);
               
                //开启线程
                t1.start();
                t2.start();
        }

}

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

15 个回复

正序浏览
我爱黑马论坛。。。。
回复 使用道具 举报
dsh 中级黑马 2014-10-9 22:19:29
14#
没有    高新我就看了  枚举
回复 使用道具 举报
dsh 发表于 2014-10-9 20:07
代码发过来 我学习学习

就定义两个定时线程,7K里的线程池你没看么
回复 使用道具 举报
多谢楼主分享
回复 使用道具 举报
感谢楼主分享!
回复 使用道具 举报
感谢楼主分享!
回复 使用道具 举报
不错!!!!
回复 使用道具 举报
感谢分享!
回复 使用道具 举报
dsh 中级黑马 2014-10-9 20:07:54
7#
646245771 发表于 2014-10-9 17:36
我直接通过线程池创建两个定时线程做出来了 没你想的那么深远

代码发过来 我学习学习
回复 使用道具 举报
我直接通过线程池创建两个定时线程做出来了:L 没你想的那么深远
回复 使用道具 举报
dsh 发表于 2014-10-9 16:55
我只是想做成一个线程添加一次   也就是说 a 加了 b加   在a 加了 b加  a 加了 b加   

不知道  您有什么 ...

既然你是想轮流添加我就没啥说的了。
不过按照这题目的意思,像是a、b、b、a、a、b这种的应该也行吧?
还是我理解错了?
回复 使用道具 举报
水竹 发表于 2014-10-9 14:40
感觉楼主想复杂了,两个线程做的都是同样的事情,不涉及生产消费的问题啊,看题目要求应该就是每个线程添加 ...

我只是想做成一个线程添加一次   也就是说 a 加了 b加   在a 加了 b加  a 加了 b加   

不知道  您有什么更好的办法
回复 使用道具 举报
在学野马 来自手机 中级黑马 2014-10-9 14:45:33
藤椅
楼主多少分
回复 使用道具 举报
感觉楼主想复杂了,两个线程做的都是同样的事情,不涉及生产消费的问题啊,看题目要求应该就是每个线程添加三个数据,不要把两个数据存到相同的位置就好了,并没有说需要你写一个、我写一个这样轮流写,简单的给操作共享资源的代码加上锁就好了吧?
回复 使用道具 举报
可惜当时我没有做出来,  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马