优化一下这段代码 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) { if (arr.size() == 0) { System.out.println("很遗憾" + Thread.currentThread().getName() + "没有抽到奖"); } else { 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(list.size() - 1)); } }}}}
时间: 2024-02-10 20:14:52 浏览: 64
这段代码可以进行如下优化:
1. 在构造函数中对列表进行随机排序可以移动到run方法中,这样可以避免多个线程同时访问list对象时的竞争问题。
2. 在使用ArrayList类时,如果不需要线程安全的操作,可以使用更高效的数组操作来代替。
3. 在添加元素到TreeSet时,可以使用TreeSet的addAll方法来添加整个列表,这样可以减少加锁的次数,从而提高性能。
下面是优化后的代码:
```
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.TreeSet;
public class MyRun06 implements Runnable {
private final int[] list;
public MyRun06(int[] list) {
this.list = list;
}
@Override
public void run() {
ArrayList<Integer> shuffledList = new ArrayList<>(list.length);
for (int i : list) {
shuffledList.add(i);
}
Collections.shuffle(shuffledList);
TreeSet<Integer> arr = new TreeSet<>();
for (int i : shuffledList) {
arr.add(i);
}
synchronized (MyRun06.class) {
if (arr.size() == 0) {
System.out.println("很遗憾" + Thread.currentThread().getName() + "没有抽到奖");
} else {
int sum = arr.stream().mapToInt(Integer::intValue).sum();
System.out.println(Thread.currentThread().getName() + arr + "最高奖为" + arr.last() + "和为" + sum);
}
}
}
}
```
在这个版本中,我们使用了int数组来代替ArrayList,并且在构造函数中没有进行随机排序。在run方法中,我们将int数组转换为ArrayList并进行随机排序,然后使用addAll方法将整个列表添加到TreeSet中。在加锁时,我们只需要锁住MyRun06类本身即可。在输出结果时,我们使用了Java 8的流式API来计算和值。
阅读全文