黑马程序员技术交流社区

标题: 今天的黑马面试题 详解 [打印本页]

作者: dsh    时间: 2014-10-9 12:18
标题: 今天的黑马面试题 详解
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();
        }

}

作者: dsh    时间: 2014-10-9 14:29
可惜当时我没有做出来,  
作者: 水竹    时间: 2014-10-9 14:40
感觉楼主想复杂了,两个线程做的都是同样的事情,不涉及生产消费的问题啊,看题目要求应该就是每个线程添加三个数据,不要把两个数据存到相同的位置就好了,并没有说需要你写一个、我写一个这样轮流写,简单的给操作共享资源的代码加上锁就好了吧?
作者: 在学野马    时间: 2014-10-9 14:45
楼主多少分
作者: dsh    时间: 2014-10-9 16:55
水竹 发表于 2014-10-9 14:40
感觉楼主想复杂了,两个线程做的都是同样的事情,不涉及生产消费的问题啊,看题目要求应该就是每个线程添加 ...

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

不知道  您有什么更好的办法
作者: 水竹    时间: 2014-10-9 17:02
dsh 发表于 2014-10-9 16:55
我只是想做成一个线程添加一次   也就是说 a 加了 b加   在a 加了 b加  a 加了 b加   

不知道  您有什么 ...

既然你是想轮流添加我就没啥说的了。
不过按照这题目的意思,像是a、b、b、a、a、b这种的应该也行吧?
还是我理解错了?
作者: 646245771    时间: 2014-10-9 17:36
我直接通过线程池创建两个定时线程做出来了:L 没你想的那么深远
作者: dsh    时间: 2014-10-9 20:07
646245771 发表于 2014-10-9 17:36
我直接通过线程池创建两个定时线程做出来了 没你想的那么深远

代码发过来 我学习学习
作者: clevergump    时间: 2014-10-9 21:08
感谢分享!
作者: Chills719    时间: 2014-10-9 21:31
不错!!!!
作者: ☆枫の云    时间: 2014-10-9 21:34
感谢楼主分享!
作者: zuichu    时间: 2014-10-9 21:51
感谢楼主分享!
作者: 高泳    时间: 2014-10-9 21:56
多谢楼主分享
作者: 646245771    时间: 2014-10-9 21:59
dsh 发表于 2014-10-9 20:07
代码发过来 我学习学习

就定义两个定时线程,7K里的线程池你没看么
作者: dsh    时间: 2014-10-9 22:19
没有    高新我就看了  枚举

作者: bitwdh    时间: 2016-7-3 20:35
我爱黑马论坛。。。。




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