s****y 发帖数: 503 | 1 该方法要去除list的所有null,因为输入的list非常、非常大,请问如何尽可能地改进
这个方法?
public void removeAllNull(LinkedList 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 dnaList, Properties results) {
synchronized (results) {
Iterator 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));
}
}
}
}
} |
g*****g 发帖数: 34805 | 2 No.1 is not a multithread program, I don't see why you need lock there. If
you are able to use Java 8, try parallel Stream. If you are using Java 7 and
under, split the list using Guava and run ExecutorService with
CountDownLatch or blocking on futures for coordination.
No.2 Use a ConcurrentHashMap with AtomicInteger.
【在 s****y 的大作中提到】 : 该方法要去除list的所有null,因为输入的list非常、非常大,请问如何尽可能地改进 : 这个方法? : public void removeAllNull(LinkedList 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); : }
|
e********2 发帖数: 495 | 3 Java 7有RecursiveTask,挺好的。
and
【在 g*****g 的大作中提到】 : No.1 is not a multithread program, I don't see why you need lock there. If : you are able to use Java 8, try parallel Stream. If you are using Java 7 and : under, split the list using Guava and run ExecutorService with : CountDownLatch or blocking on futures for coordination. : No.2 Use a ConcurrentHashMap with AtomicInteger.
|
e********2 发帖数: 495 | 4 话说Matlab也是用Java做的,为什么多线程那么慢?我觉得没人会用Matlab的Parallel
库。
【在 e********2 的大作中提到】 : Java 7有RecursiveTask,挺好的。 : : and
|
n******t 发帖数: 4406 | 5 这两道题在实际编程中基本上没用.
【在 s****y 的大作中提到】 : 该方法要去除list的所有null,因为输入的list非常、非常大,请问如何尽可能地改进 : 这个方法? : public void removeAllNull(LinkedList 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); : }
|
s****y 发帖数: 503 | 6
and
第二题能不能帮我写个例子?
【在 g*****g 的大作中提到】 : No.1 is not a multithread program, I don't see why you need lock there. If : you are able to use Java 8, try parallel Stream. If you are using Java 7 and : under, split the list using Guava and run ExecutorService with : CountDownLatch or blocking on futures for coordination. : No.2 Use a ConcurrentHashMap with AtomicInteger.
|
g*****g 发帖数: 34805 | 7 ConcurrentMap map;
map.get(key).incrementAndGet(); |
s****y 发帖数: 503 | 8
如果我只要一个变量,是不是可以只用AtomicInteger?不加ConcurrentHashMap不影响
性能吧?
AtomicInteger a = new AtomicInteger();
a.incrementAndGet();
【在 g*****g 的大作中提到】 : ConcurrentMap map; : map.get(key).incrementAndGet();
|
g*****g 发帖数: 34805 | 9 可以,不过既然只有一个变量,为啥要弄个Properties.
【在 s****y 的大作中提到】 : : 如果我只要一个变量,是不是可以只用AtomicInteger?不加ConcurrentHashMap不影响 : 性能吧? : AtomicInteger a = new AtomicInteger(); : a.incrementAndGet();
|
s****y 发帖数: 503 | 10
估计是题目想增加些难度,所以加个Properties。
题中要求Each thread provided with its own private share of the work (the
list, individual to each thread),是不是要为每个线程传入一个新的对象(实现
Callable的),每个对象的list都是私有的?
【在 g*****g 的大作中提到】 : 可以,不过既然只有一个变量,为啥要弄个Properties.
|