本帖最后由 sinat_24152013 于 2015-01-06 07:14:37 编辑

解决方案 »

  1.   

    第一题:f.remove(i);效率太低,改成iterator.remove形式。
    第二题:synchronized (results) 这个锁的范围太大了。还有synchronized (lock)这里的lock是在方法内部new的,这样应该不对,每个线程在执行这段代码时都会new出新的lock,达不到锁的效果(我是这样理解的,欢迎指正)。
      

  2.   

    第一题:
    1.为什么要  synchronized (lock) ,你之前的 List lock = new ArrayList() 预示每个线程进来都是不同的lock对象。
    2.就像2楼所说删除的方式改为iterator.remove形式
    3.你这题本身没和多线程扯上关系呢,如果真想用多线程完成,那么可以先进行并行的快速排序,记录最后一个null的位置,排序完就知道结果了。第二题:
    1.实现思路不太对....,你所要实现不就是各子线程完成业务然后对自己的私有属性dnaList、results更新么,然后主线程要能够获取到各子线程属性状态?那么基本上可以这样实现: class Scanthread implements Runnable{        ConcurrentLinkedQueue dnaList;
            volatile Object results;
            
            public void run() {
            //具体业务操作 
            }    }
        
       
     class Mainthread implements Runnable{        //存放各子线程变量数组
            ConcurrentLinkedQueue[] dnaLists;
            Object[] results;
            
            public void run() {
            //具体迭代获取子线程操作 
            }    }
    2.我使用的集合组件你可以自己网上搜一下,看看他的并发特性。
      

  3.   

    关于第一题我就想不明白了,为什么不在放的时候把 null 给过滤掉?
      

  4.   

    第一题:改成iterator.remove形式。
    第二题:如果只是存放结果  results.setProperty(key, String.valueOf(Integer.valueOf(results.getProperty(key)) + 1)); 没有其他操作,不存在同步问题,是不需要加锁的。
      

  5.   

    第一个可以多线程并行处理,建临时的全局线程安全的list,然后把所有不为null的直接塞进去不好么?可以省掉你remove了。
      

  6.   

    1  lock这个对象完全没用,凡是有的地方全部删掉
     
    2  synchronized (results) 这个去掉synchronized (lock) 改成 synchronized (results)
      

  7.   


    第二题能不能帮我写个例子?上面就算例子了啊,你自己加入业务逻辑就行了,启动的时候用JDK线程池装载
      

  8.   

    首先第一题, 这种删除方法是错误的. null不能完全清除.然后不明白跟多线程有什么关系,最后楼上已经有合适的方法.