黑马程序员技术交流社区

标题: 一位同学分享的面试题,不会做,请大家帮帮忙 [打印本页]

作者: z-翔    时间: 2014-9-11 11:53
标题: 一位同学分享的面试题,不会做,请大家帮帮忙
本帖最后由 z-翔 于 2014-9-13 09:18 编辑

在一位同学分享的面试经验里看到的代码题,那位同学当前不在线,
所以只能拿过来请教下大家了
声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
给数组中添加数据,每一个线程为数组添加3个数据即可。


作者: fantacyleo    时间: 2014-9-11 15:07
while循环,“每隔一段时间”就用sleep来模拟。如果有同步要求,如一个线程正在添加时另一个线程不能干扰,那就加上synchronized同步
作者: 逍遥呆    时间: 2014-9-11 15:25
上面说的对,要加上定义线程
作者: z-翔    时间: 2014-9-11 17:04
fantacyleo 发表于 2014-9-11 15:07
while循环,“每隔一段时间”就用sleep来模拟。如果有同步要求,如一个线程正在添加时另一个线程不能干扰, ...

谢谢,搞定了
作者: 思维    时间: 2014-9-11 17:23
本帖最后由 思维 于 2014-9-11 17:25 编辑

不会是入学面试吧!感觉有点难度啊:L
  1. import java.util.concurrent.*;
  2. import java.util.*;
  3. class ThreadDemo{
  4.         public static void main(String[] args){       
  5.                 final int[] arr = new int[6];
  6.                 final ShareData sd = new ShareData();
  7.                 for(int i=0;i<2;i++){
  8.                         new Thread(new Runnable(){                                       
  9.                                 public void run(){
  10.                                         for(int j=0;j<3;j++){
  11.                                                 try{
  12.                                                         Thread.sleep((new Random().nextInt(10)+1)*500);
  13.                                                 }catch(Exception e){
  14.                                                         e.printStackTrace();
  15.                                                 }
  16.                                                 int n = sd.increment();
  17.                                                 arr[n] = new Random().nextInt(10);
  18.                                                 System.out.println(Thread.currentThread().getName()
  19.                                                                 +"::"+n+"::"+arr[n]);       
  20.                                         }
  21.                                 }
  22.                         }).start();
  23.                 }
  24.         }
  25. }
  26. //共享数据封装到一个类中
  27. class ShareData{
  28.         private int i = 0;
  29.         public synchronized int increment(){
  30.                 return i++;
  31.         }
  32. }
复制代码







作者: 大成哥    时间: 2014-9-11 19:34
学习了!
作者: 中华教书人    时间: 2014-9-11 19:36
这是入学面试题,还是入学测试题?入学视频面试的题目吗?
作者: z-翔    时间: 2014-9-11 19:39
中华教书人 发表于 2014-9-11 19:36
这是入学面试题,还是入学测试题?入学视频面试的题目吗?

http://bbs.itheima.com/thread-142581-1-1.html
作者: 思维    时间: 2014-9-11 20:35
z-翔 发表于 2014-9-11 19:39
http://bbs.itheima.com/thread-142581-1-1.html

学员杀手啊!问的代码题真难!
作者: 进击的大鹏    时间: 2014-9-11 20:52
好难得面试题啊,考多线程同步这块儿的东西
作者: 黄凯旋    时间: 2014-9-11 21:24
收集面试题中到时候集中处理
作者: 袁枭飞    时间: 2014-9-11 21:49
面试好像很难哎
作者: yuli2039    时间: 2014-9-11 23:58
以下是我自己写的,请大家指正!
  1. package com.test;

  2. import java.util.Random;

  3. public class Addt {
  4.         public static void main(String[] args) {
  5.                 final int[] arr = new int[6];//定义数组
  6.                 for(int x = 0;x<2;x++){//用for循环创建两个线程
  7.                         if(x==0){//第一个线程,添加数组的前三个元素
  8.                                 new Thread(){
  9.                                         @Override
  10.                                         public void run() {
  11.                                                 //for循环给数组前三个元素赋值
  12.                                                 for(int z = 0;z<3;z++){
  13.                                                         try {//这里直接停1秒,可以写随机数,挺随机的时间
  14.                                                                 Thread.sleep(1000);
  15.                                                         } catch (InterruptedException e) {
  16.                                                                 e.printStackTrace();
  17.                                                         }
  18.                                                         arr[z]=new Random().nextInt(10)+1;
  19.                                                 }       
  20.                                         }                               
  21.                                 }.start();
  22.                         }else{
  23.                                 new Thread(){
  24.                                         @Override
  25.                                         public void run() {
  26.                                                 //for循环给后三个元素赋值
  27.                                                 for(int z = 3;z<6;z++){
  28.                                                         try {
  29.                                                                 Thread.sleep(1000);
  30.                                                         } catch (InterruptedException e) {
  31.                                                                 e.printStackTrace();
  32.                                                         }
  33.                                                         arr[z]=new Random().nextInt(10)+1;
  34.                                                 }       
  35.                                         }                               
  36.                                 }.start();       
  37.                         }
  38.                 }
  39.                 //打印数组
  40.                 //注意,执行打印动作的是主线程,这里需要休息一段时间,因为给数组赋值的两个新线程有休息的动作,有可能新线程还没完成赋值动作主线程已经执行打印数组动作,数组就全是0!!!
  41.                 try {
  42.                         Thread.sleep(10000);//多休息一会儿
  43.                 } catch (InterruptedException e) {
  44.                         e.printStackTrace();
  45.                 }
  46.                 for(int a : arr){
  47.                         System.out.print(a+" ");
  48.                 }
  49.         }
  50. }
复制代码

作者: pvting    时间: 2014-9-12 00:01
这道题目主要考的线程锁,在代码上加上同步语句synchronized语句
作者: 梦里听传说    时间: 2014-9-12 00:05
我去研究下




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