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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 遗忘 中级黑马   /  2014-12-19 13:49  /  1135 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 遗忘 于 2014-12-26 10:02 编辑

下面是我自己的的代码, 感觉有些麻烦,有没有更简单的?

  1. import java.util.Random;
  2. public class ShareArrayDemo {

  3.         /**
  4.          * 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
  5.          * 给数组中添加数据,每一个线程为数组添加3个数据即可。
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 //获取拥有数组的对象
  11.                 final ShareArray shareArray = ShareArray.getInstance();
  12.                 //创建线程
  13.                 Thread tA = new Thread(new Runnable(){
  14.                         public void run(){
  15.                                 for (int i = 0; i < 3; i++) {
  16.                                         shareArray.addInfoFirst();
  17.                                 }
  18.                         }
  19.                 });
  20.                 Thread tB = new Thread(new Runnable(){
  21.                         public void run(){
  22.                                 for (int i = 0; i < 3; i++) {
  23.                                         shareArray.addInfoSecond();
  24.                                 }
  25.                         }
  26.                 });
  27.                 //给线程命名
  28.                 tA.setName("线程A");
  29.                 tB.setName("线程B");
  30.                 //开启线程并运行
  31.                 tA.start();
  32.                 tB.start();
  33.         }

  34. }

  35. //因为数组是共享数据,设计为单例
  36. class ShareArray{
  37.         private static ShareArray arr = null;
  38.         private ShareArray(){}
  39.         //定义数组
  40.         private String[] strs = new String[6];
  41.         //定义线程等待标记
  42.         private boolean flag = true;
  43.         //定义标记,用于接收每个线程给数组添加元素的个数
  44.         private int count1 = 1,count2 =1;
  45.         public static ShareArray getInstance() {
  46.                 if(arr == null)
  47.                 {
  48.                         synchronized(ShareArray.class){
  49.                                 if (arr==null) {
  50.                                         arr = new ShareArray();
  51.                                 }
  52.                         }
  53.                 }
  54.                 return arr;
  55.         }
  56.         //显示数组元素信息
  57.         public void showArrayInfo()
  58.         {
  59.                 System.out.println("此时数组中元素列表:");
  60.                 for (int i = 0; i < strs.length; i++) {
  61.                         System.out.println("角标:"+i+":"+ strs[i]);
  62.                 }
  63.         }
  64.         //第一个线程添加元素方法
  65.         public synchronized void addInfoFirst(){
  66.                 //判断标记
  67.                 while (!flag) {
  68.                         try {
  69.                                 this.wait();
  70.                         } catch (Exception e) {
  71.                                 // TODO: handle exception
  72.                         }
  73.                 }
  74.                 //遍历数组 ,如果数组该角标位元素值不为null,则添加元素并退出循环,否则进行下一次循环;
  75.                 for (int i = 0; i < strs.length; i++) {
  76.                         if (strs[i]==null) {
  77.                                 strs[i] = Thread.currentThread().getName()+
  78.                                                 "添加的第"+ count1+"个元素";
  79.                                 System.out.println(Thread.currentThread().getName()+
  80.                                                 "给数组添加的第"+(i+1)+"个元素:"+ strs[i]);
  81.                                 //显示当前数组元素信息
  82.                                 showArrayInfo();
  83.                                 //记录添加元素的个数加一
  84.                                 count1++;
  85.                                 break;
  86.                         }else
  87.                                 continue;
  88.                 }
  89.                 try {
  90.                         //让两个线程随机时间间隔执行
  91.                         Thread.sleep((new Random().nextInt(100)+1)*100);
  92.                 } catch (Exception e) {
  93.                         // TODO: handle exception
  94.                 }
  95.                 //修改标记
  96.                 flag = false;
  97.                 //唤醒线程
  98.                 this.notify();
  99.         }
  100.         //第二个线程添加数组元素的方法
  101.         public synchronized void addInfoSecond(){
  102.                 while (flag) {
  103.                         try {
  104.                                 this.wait();
  105.                         } catch (Exception e) {
  106.                                 // TODO: handle exception
  107.                         }
  108.                 }
  109.                 for (int i = 0; i < strs.length; i++) {
  110.                         if (strs[i]==null) {
  111.                                 strs[i] = Thread.currentThread().getName()+
  112.                                                 "添加的第"+ count2+"个元素";
  113.                                 System.out.println(Thread.currentThread().getName()+
  114.                                                 "给数组添加的第"+(i+1)+"个元素:"+ strs[i]);
  115.                                 showArrayInfo();
  116.                                 count2++;
  117.                                 break;
  118.                         }else
  119.                                 continue;
  120.                 }
  121.                 try {
  122.                         Thread.sleep((new Random().nextInt(100)+1)*100);
  123.                 } catch (Exception e) {
  124.                         // TODO: handle exception
  125.                 }
  126.                 flag = true;
  127.                 this.notify();
  128.         }
  129. }
复制代码




1 个回复

倒序浏览
好多。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马