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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张建银 黑马帝   /  2012-2-6 21:57  /  2092 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.编写程序利用Random类的对象的链表中一随机的顺序存储一副144张的麻将。用含有连个字符的字符串代表麻将,
例如“11”表示一万,“12”表示2万等。从栈中输出4手牌,每手牌有13张牌,手牌按万条筒风牌排序,输出时要把11显示为一万
12显示成二万这样
下面是我写出的136张麻将(除掉了花),为什么把Thread放在for循环里会报ArrasyIndexOutOf Exception,而单独newThread,不报异常,
package cn.itcast.exam;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
public class Majiang
{
        String[] majiangzi={"一万","二万","三万","四万","五万","六万","七万","八万","九万","一条","二条","三条","四条","五条","六条","七条","八条","九条","一筒","二筒","三筒","四筒","五筒","六筒","七筒","八筒","九筒","东风","南风","西风","北风","红中","白板","发财"};
        int[] majiangshu={11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,100,101,102,103,104,105,106};
        TreeMap<Integer,String> map=new TreeMap<Integer, String>();
        ArrayList<Integer> al=new ArrayList<>();
        public static void main(String[] args)
        {
                final Majiang ma=new Majiang();
                ma.fetch(new ArrayList());
                        new Thread(new Runnable()
                        {                       
                                @Override
                                public void run()
                                {                                       
                                        ArrayList ar2=new ArrayList();                               
                                        ma.fetch(ar2);
                                        ma.al.removeAll(ar2);
                                }
                        }).start();
                        new Thread(new Runnable()
                        {                               
                                @Override
                                public void run()
                                {                               
                                        ArrayList ar2=new ArrayList();                               
                                        ma.fetch(ar2);
                                        ma.al.removeAll(ar2);
                                }
                        }).start();
                        new Thread(new Runnable()
                        {                               
                                @Override
                                public void run()
                                {                                       
                                        ArrayList ar2=new ArrayList();                               
                                        ma.fetch(ar2);
                                        ma.al.removeAll(ar2);
                                }
                        }).start();               
        }                       
                public synchronized  void fetch(ArrayList al2){
                for(int i=0;i<majiangshu.length ;i++){
                        al.add(majiangshu[i]);
                        al.add(majiangshu[i]);
                        al.add(majiangshu[i]);
                        al.add(majiangshu[i]);
                        map.put(majiangshu[i], majiangzi[i]);
                }               
                //System.out.println(al.size());
                for(int j=0;j<13;j++){
                        int a=new Random().nextInt(136);
                        int b= al.get(a);
                        al2.add(b);
                        //al.remove((Integer)b);
                        //System.out.println(b);
                }
                al.removeAll(al2);
                Object[] obj=al2.toArray();
                Arrays.sort(obj);
                //System.out.println(obj.length);
                for(Object ob:obj){System.out.print(map.get((Integer) ob)+" ");}
                System.out.println();
        }  
}

评分

参与人数 1技术分 +2 收起 理由
荣凯旋 + 2

查看全部评分

6 个回复

倒序浏览
如果for(int i=0;i<3;i++){  new Thread(new Runnable()
                        {                        
                                @Override
                                public void run()
                                {                                       
                                        ArrayList ar2=new ArrayList();                                
                                        ma.fetch(ar2);
                                        ma.al.removeAll(ar2);   //这里会报 ArrasyIndexOutOf Exception,而且打印出来的文字有点混乱
                                }
                        }).start();
}
回复 使用道具 举报
你意思是,用一for 循环代替上面三个“ new Thread(new Runnable() ”,报 ArrasyIndexOutOf Exception?但我编译运行,并无错。只是你的代码有些明显错误,如:new ArrayList<>(); --- 漏了Integer .
回复 使用道具 举报
测试结果为:
ma.al.removeAll(ar2);   //报java.lang.ConcurrentModificationException异常

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
ArrayList<Integer> al=new ArrayList<>();
for(Object ob:obj){System.out.print(map.get((Integer) ob)+" ");}
这两行代码修改后,起初我运行是能成功的,可是当我在多长运行的时候
就出现了异常,主要都是ma.al.removeAll(ar2);处产生了异常,我所想的
是可能是这三个线程不能够同步导致的原因,因为很有可能在第一个线程
调用removeAll()方法的时候,正在移除时,第二个线程已经取走了,它认为
还存在的牌,因为java是多线程的,代码我也修改了但是还没有成功,具体
怎么回事,我也不是太明白。希望得到解决!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
":o"怎么变成了{:soso_e114:} 输入法?我也没有用原码呀 :o
回复 使用道具 举报
黄秋 黑马帝 2012-2-8 19:07:04
7#
本帖最后由 黄秋 于 2012-2-8 19:13 编辑

下面的代码,我也是复制你的,只改了两个明显错误,运行多次正常,无异常:
  1. import java.util.*;
  2. public class Majiang
  3. {
  4.         String[] majiangzi={"一万","二万","三万","四万","五万","六万","七万","八万","九万","一条","二条","三条","四条","五条","六条","七条","八条","九条","一筒","二筒","三筒","四筒","五筒","六筒","七筒","八筒","九筒","东风","南风","西风","北风","红中","白板","发财"};
  5.         int[] majiangshu={11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,100,101,102,103,104,105,106};
  6.         TreeMap<Integer,String> map=new TreeMap<Integer, String>();
  7.         ArrayList<Integer> al=new ArrayList<Integer>();
  8.         public static void main(String[] args)
  9.         {
  10.                 final Majiang ma=new Majiang();
  11.                 ma.fetch(new ArrayList());
  12.                 for(int i=0;i<3;i++){  new Thread(new Runnable()
  13.                         {                        
  14.                                 @Override
  15.                                 public void run()
  16.                                 {                                       
  17.                                                 ArrayList ar2=new ArrayList();                                
  18.                                                 ma.fetch(ar2);
  19.                                                 ma.al.removeAll(ar2);
  20.                                 }
  21.                         }).start();
  22.                 }              
  23.         }                        
  24.         public synchronized  void fetch(ArrayList al2){
  25.                 for(int i=0;i<majiangshu.length ;i++){
  26.                         al.add(majiangshu[i]);
  27.                         al.add(majiangshu[i]);
  28.                         al.add(majiangshu[i]);
  29.                         al.add(majiangshu[i]);
  30.                         map.put(majiangshu[i], majiangzi[i]);
  31.                 }               
  32.                 //System.out.println(al.size());
  33.                 for(int j=0;j<13;j++){
  34.                         int a=new Random().nextInt(136);
  35.                         int b= al.get(a);
  36.                         al2.add(b);
  37.                         //al.remove((Integer)b);
  38.                         //System.out.println(b);
  39.                 }
  40.                 al.removeAll(al2);
  41.                 Object[] obj=al2.toArray();
  42.                 Arrays.sort(obj);
  43.                 //System.out.println(obj.length);
  44.                 for(Object ob:obj){System.out.print(map.get((Integer) ob)+" ");}
  45.                 System.out.println();
  46.         }  
  47. }
复制代码
如显示的代码与表情符号冲突,用代码标签,或自行输入[code] 标记。冒号+o 刚好是::o 。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马