该方法要去除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了。
------解决思路----------------------
这就是需求,你是开发么?
------解决思路----------------------
1 lock这个对象完全没用,凡是有的地方全部删掉
2 synchronized (results) 这个去掉
synchronized (lock) 改成 synchronized (results)
------解决思路----------------------
上面就算例子了啊,你自己加入业务逻辑就行了,启动的时候用JDK线程池装载
------解决思路----------------------
表示完全看不懂第一题那个写法有什么高深的用意
------解决思路----------------------
首先第一题, 这种删除方法是错误的. null不能完全清除.然后不明白跟多线程有什么关系,最后楼上已经有合适的方法.