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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏乞儿 中级黑马   /  2014-10-8 11:03  /  1365 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

声明一个共享数组,起两个线程,两个线程每隔一段时间(可以是以个随机数),给数组中添加元素,每一条线程为数组添加3个数据即可。
  1. package cn.itcast.Thread;

  2. import java.util.Random;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.TimeUnit;

  5. /*
  6. * 定义一个共享数组,其两个线程,两个元素每隔一段时间分别向这个数组中添加元素(时间可以是随机的),每一条线程给数组添加3个元素即可。
  7. * 思路:
  8. * 1.使用线程池newScheduledThreadPool()
  9. * 2.设置数组
  10. */
  11. public class ThreadPool {

  12.         public static void main(String[] args) {
  13.                 // 定义一个线程池,初始线程2条
  14.                 Executors.newScheduledThreadPool(2).scheduleAtFixedRate(new Runnable(){
  15.                         public void run(){
  16.                                 addElements();
  17.                                 printArray();
  18.                                 System.out.println();
  19.                         }
  20.                 },
  21.                                 0,
  22.                                 new Random().nextInt(2)+1,
  23.                                 TimeUnit.SECONDS);               
  24.                
  25.         }
  26.         //定义数组因为是同一个数组,必须是成员变量
  27.         static int[]arr=new int[51];
  28.         static int index=0;
  29.         //
  30.         public static  void addElements(){
  31.                 //每条线程都是添加3个元素
  32.                 for(int i=1;i<=3;i++){
  33.                         arr[index++]=new Random().nextInt(20)+1;
  34.                 }
  35.         }
  36.         public static  void printArray(){
  37.                 System.out.print(Thread.currentThread().getName());
  38.                 for(int i=0;i<arr.length;i++){
  39.                         System.out.print(arr[i]+" ");
  40.                 }
  41.         }
  42. }
复制代码

关于线程池的问题,声明共享数组,这样做对吗?数组加静态可以吗?线程池里的俩个线程能实现同步吗?求大神指点!

3 个回复

倒序浏览
我感觉你的代码好像有一些问题,不知道对不对哈:
addElements方法会报空指针异常,因为数据长度只有51,而你的index不断加加就会超出范围。
还有你的只提交了一个任务给线程池,所以不存在同步的问题,因为你的代码同一时间只会有一个线程去执行,我们说的同步时有多个线程同时去执行的时候才需要同步的。所以你应该提交两给Runnable给线程池,同步的话你需要加syncronized
回复 使用道具 举报
李小强 发表于 2014-10-8 12:11
我感觉你的代码好像有一些问题,不知道对不对哈:
addElements方法会报空指针异常,因为数据长度只有51,而 ...

      代码肯定是有问题的,那就是根本就停不下来。哈。。我对线程池还不是很了解。我是提交了一个任务给线程池,可是有两条线程啊,动态的向数组里添加元素,能不能实现线程0添加3个,线程1再添加3个,这样交替添加。。。。
回复 使用道具 举报
苏乞儿 发表于 2014-10-11 20:41
代码肯定是有问题的,那就是根本就停不下来。哈。。我对线程池还不是很了解。我是提交了一个任务给 ...

你理解错了,Executors.newScheduledThreadPool(2)这句代码虽然说明了线程池中有两个线程,但是不代表这两个线程就一定会一起运行,而是看任务有多少个的,你只提交了一个任务,那一个线程来处理就够了,所以池中虽然有两个线程,但是只有一个线程在运行,能明白吗?我给你打个比方:
线程池就好比一个手机店,店里的多名店员就代表多个线程,一个顾客就代表一个任务,如果只来了一个顾客,那让一个店员(即一个线程)去接待这一位顾客(即一个任务)即可,那其他的店员(线程)是空闲状态的。
想要验证我说的对不对,你在你的任务代码中输出Thread.currentThread().getName(),看是不是每次循环输出的这个name是不是一样,是一样的话就说明只有一个线程在运行,因为不同线程的name是不同的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马