java 多线程对集合操作 完整代码
时间: 2023-09-08 17:05:19 浏览: 185
### 回答1:
以下是一个简单的Java多线程操作集合的完整代码:
public class MultiThreadCollection {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
// 创建多个线程
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// 向集合中添加元素
for (int i = 0; i < 20; i++) {
list.add(i);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 从集合中删除元素
for (int i = 0; i < 20; i++) {
list.remove(i);
}
}
});
// 启动线程
t1.start();
t2.start();
}
}
### 回答2:
Java多线程对集合操作的完整代码如下:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class ThreadSafeCollectionExample {
public static void main(String[] args) throws InterruptedException {
// 创建一个ArrayList集合
List<Integer> list = new ArrayList<>();
// 将ArrayList包装成线程安全的CopyOnWriteArrayList
List<Integer> threadSafeList = new CopyOnWriteArrayList<>(list);
// 创建10个线程,每个线程向集合中添加100个元素
Runnable runnable = () -> {
for (int i = 0; i < 100; i++) {
threadSafeList.add(i);
}
};
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(runnable);
thread.start();
threads.add(thread);
}
// 等待所有线程执行完毕
for (Thread thread : threads) {
thread.join();
}
// 输出集合大小,预期结果是1000
System.out.println("集合大小:" + threadSafeList.size());
// 遍历集合,输出每个元素
for (Integer num : threadSafeList) {
System.out.println(num);
}
}
}
```
以上代码演示了如何使用多线程安全的`CopyOnWriteArrayList`对集合进行操作。在主线程中,我们先创建了一个普通的`ArrayList`,然后将其包装成线程安全的`CopyOnWriteArrayList`。接下来,我们创建了10个线程,并让每个线程向集合中添加100个元素。最后,我们等待所有线程执行完毕,输出集合的大小和每个元素。
`CopyOnWriteArrayList`是线程安全的集合,内部是通过复制底层数组的方式实现的。每次对集合进行修改时,都会创建一个新的数组,然后将修改后的结果拷贝到新数组中,最后再将新数组赋值给原数组。因此,它适用于读多写少的场景,但是由于每次写操作都会生成一个新的数组,占用了额外的内存空间,所以相比普通的ArrayList,它的性能略差一些。
### 回答3:
下面是一个使用Java多线程对集合操作的完整代码示例:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionThreadExample {
public static void main(String[] args) throws InterruptedException {
List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());
// 创建并启动两个线程分别向集合中添加元素
Thread addThread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
numbers.add(i);
}
});
Thread addThread2 = new Thread(() -> {
for (int i = 100; i < 200; i++) {
numbers.add(i);
}
});
addThread1.start();
addThread2.start();
// 等待两个添加线程执行完毕
addThread1.join();
addThread2.join();
// 打印集合中的元素
for (Integer number : numbers) {
System.out.println(number);
}
}
}
```
在这个例子中,我们使用了一个`List`接口的实现类`ArrayList`来表示一个集合。为了保证多线程安全,我们使用了`Collections.synchronizedList`方法将`ArrayList`转换为一个线程安全的`List`对象。
接下来,我们创建了两个线程`addThread1`和`addThread2`,分别向集合中添加元素。在每个线程中,我们使用`numbers.add(i)`方法将元素添加到集合中。
然后,我们调用了`start`方法启动两个添加线程。为了确保这两个线程执行完毕后再执行下面的代码,我们使用`join`方法来等待线程执行完毕。
最后,我们使用增强的`for`循环遍历集合中的元素,并将其打印到控制台上。
请注意,在多线程环境中修改集合可能导致线程安全问题,因此在对集合进行操作时,我们需要采取相应的措施,保证线程安全。在这个例子中,我们使用了`synchronizedList`方法来返回一个线程安全的`List`对象,以确保在多个线程同时修改集合时能够正确地同步访问。