当前位置: 代码迷 >> J2SE >> 有两道Java多线程的面试题能不能帮小弟我看看
  详细解决方案

有两道Java多线程的面试题能不能帮小弟我看看

热度:102   发布时间:2016-04-23 20:03:15.0
有两道Java多线程的面试题能不能帮我看看?
本帖最后由 sinat_24152013 于 2015-01-06 07:14:37 编辑
该方法要去除list的所有null,因为输入的list非常、非常大,请问如何尽可能地改进这个方法?
public void removeAllNull(LinkedList<Integer> f) {
     List lock = new ArrayList();
          for (int i = 0; i < f.size(); i++) {
              synchronized (lock) {
                   if (f.get(i) == null) {
                         lock = new ArrayList();
                         f.remove(i);
                    }
                    lock.add(f);  
               }
        }
}
输入:[1, 2, null, 3, null, 4, null, 5, null, 6]
输出:[1, 2, 3, 4, 5, 6]

还有一道题,多线程共同扫描DNA,主线程在多线程中启动scanDNA方法,每个线程都有一个私有的dnaList,每个线程共享一个“results”对象来向主线程报告进度,
成功扫描次数必须精确。请改正和修改scanDNA方法以提高任务性能。

private interface DNA {
        public boolean scan();
}
public void scanDNA(List<DNA> dnaList, Properties results) {
        synchronized (results) {
                Iterator<DNA> i = dnaList.iterator();
                Object lock = new Object();
                while (i.hasNext()) {
                       if (i.next().scan()) {
                              String key = "Successful Scans Performed";
                              synchronized (lock) {
                                     results.setProperty(key, String.valueOf(Integer.valueOf(results.getProperty(key)) + 1));
                              }
                       }
                }
       }
}

------解决思路----------------------
第一题:f.remove(i);效率太低,改成iterator.remove形式。
第二题:synchronized (results) 这个锁的范围太大了。还有synchronized (lock)这里的lock是在方法内部new的,这样应该不对,每个线程在执行这段代码时都会new出新的lock,达不到锁的效果(我是这样理解的,欢迎指正)。
------解决思路----------------------
第一题:
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.我使用的集合组件你可以自己网上搜一下,看看他的并发特性。
------解决思路----------------------
关于第一题我就想不明白了,为什么不在放的时候把 null 给过滤掉?
------解决思路----------------------
第一题:改成iterator.remove形式。
第二题:如果只是存放结果  results.setProperty(key, String.valueOf(Integer.valueOf(results.getProperty(key)) + 1)); 没有其他操作,不存在同步问题,是不需要加锁的。
------解决思路----------------------
第一个可以多线程并行处理,建临时的全局线程安全的list,然后把所有不为null的直接塞进去不好么?可以省掉你remove了。
------解决思路----------------------
引用:
关于第一题我就想不明白了,为什么不在放的时候把 null 给过滤掉?



这就是需求,你是开发么?
------解决思路----------------------
1  lock这个对象完全没用,凡是有的地方全部删掉
 
2  synchronized (results) 这个去掉

synchronized (lock) 改成 synchronized (results)


------解决思路----------------------
引用:
Quote: 引用:

第一题:
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.我使用的集合组件你可以自己网上搜一下,看看他的并发特性。


第二题能不能帮我写个例子?


上面就算例子了啊,你自己加入业务逻辑就行了,启动的时候用JDK线程池装载
------解决思路----------------------
表示完全看不懂第一题那个写法有什么高深的用意
------解决思路----------------------
首先第一题, 这种删除方法是错误的. null不能完全清除.然后不明白跟多线程有什么关系,最后楼上已经有合适的方法.
  相关解决方案