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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 z-翔 于 2014-9-13 09:18 编辑

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

14 个回复

倒序浏览
while循环,“每隔一段时间”就用sleep来模拟。如果有同步要求,如一个线程正在添加时另一个线程不能干扰,那就加上synchronized同步
回复 使用道具 举报
上面说的对,要加上定义线程
回复 使用道具 举报
fantacyleo 发表于 2014-9-11 15:07
while循环,“每隔一段时间”就用sleep来模拟。如果有同步要求,如一个线程正在添加时另一个线程不能干扰, ...

谢谢,搞定了
回复 使用道具 举报
本帖最后由 思维 于 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. }
复制代码






回复 使用道具 举报
学习了!
回复 使用道具 举报
这是入学面试题,还是入学测试题?入学视频面试的题目吗?
回复 使用道具 举报
z-翔 中级黑马 2014-9-11 19:39:29
8#
中华教书人 发表于 2014-9-11 19:36
这是入学面试题,还是入学测试题?入学视频面试的题目吗?

http://bbs.itheima.com/thread-142581-1-1.html
回复 使用道具 举报
思维 高级黑马 2014-9-11 20:35:35
9#
z-翔 发表于 2014-9-11 19:39
http://bbs.itheima.com/thread-142581-1-1.html

学员杀手啊!问的代码题真难!
回复 使用道具 举报
好难得面试题啊,考多线程同步这块儿的东西
回复 使用道具 举报
收集面试题中到时候集中处理
回复 使用道具 举报
面试好像很难哎
回复 使用道具 举报
以下是我自己写的,请大家指正!
  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. }
复制代码
回复 使用道具 举报
这道题目主要考的线程锁,在代码上加上同步语句synchronized语句
回复 使用道具 举报
我去研究下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马