优化一下这段代码 import java.util.ArrayList; import java.util.Collections; import java.util.TreeSet; public class MyRun06 implements Runnable { ArrayList<Integer> list = new ArrayList<>(); public MyRun06(ArrayList<Integer> list) { this.list = list; Collections.shuffle(list); } @Override public void run() { TreeSet<Integer> arr = new TreeSet<>(); while (true) { synchronized (MyRun06.class) { if (list.size() == 0) { int sum=0; for (Integer integer : arr) { sum+=integer; } System.out.println(Thread.currentThread().getName() + arr+"最高奖为"+ arr.last()+"和为"+sum); break; } else { arr.add(list.remove(0)); } } /* try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }*/ } } }
时间: 2024-04-04 21:31:32 浏览: 59
Java.util包.docx
根据你提供的代码,我有以下优化建议:
1. 使用 LinkedList 替代 ArrayList
在这个代码中,你需要频繁地删除列表的第一个元素,使用 LinkedList 可以更有效地实现这个功能,因为 LinkedList 中的元素存储在节点中,删除一个元素只需要修改前一个节点的后继节点和后一个节点的前驱节点即可,不需要像 ArrayList 那样将后面所有元素向前移动。
2. 在构造函数中进行集合的初始化
在这个代码中,你在构造函数中将集合随机打乱,但是你可以在构造函数中直接创建一个已经打乱的集合,避免在运行时进行打乱操作。这可以通过将 ArrayList 改为 List 接口,然后在构造函数中使用 Collections.shuffle() 方法,将打乱后的集合转换为 ArrayList 来实现。
3. 优化同步块
在这个代码中,你使用同步块保证了对 list 的访问是线程安全的,但是这也意味着每个线程只能在获取到锁之后才能访问 list,这可能会导致线程的竞争和阻塞。为了避免这个问题,可以将同步块移到 else 子句中,这样只有在 list 不为空时才需要获取锁。
以下是优化后的代码:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
public class MyRun06 implements Runnable {
private List<Integer> list;
public MyRun06(List<Integer> list) {
this.list = new LinkedList<>(list);
Collections.shuffle(this.list);
}
@Override
public void run() {
TreeSet<Integer> arr = new TreeSet<>();
while (true) {
if (list.isEmpty()) {
int sum = arr.stream().mapToInt(Integer::intValue).sum();
System.out.println(Thread.currentThread().getName() + arr + "最高奖为" + arr.last() + "和为" + sum);
break;
} else {
synchronized (this) {
arr.add(list.remove(0));
}
}
}
}
}
阅读全文