有一个全局数组int arr[]={1,2,3,4,5,6,7,8,9,10},现需要使用两个线程按顺序交替将数组内容打印出来(每个线程打印一次,直到全部打印完)
时间: 2024-10-18 16:10:34 浏览: 10
为了实现这个需求,可以使用Java的并发库`java.util.concurrent`中的`Semaphore`和`Callable`或者`FutureTask`,配合`synchronized`关键字来保证线程安全地交替访问数组元素。以下是简单的示例代码:
```java
import java.util.concurrent.*;
public class PrintArray {
private int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
private Semaphore semaphore = new Semaphore(1); // 一个信号量用于控制打印权
public class PrintThread implements Callable<Void> {
private int index;
public PrintThread(int index) {
this.index = index;
}
@Override
public Void call() throws Exception {
try {
semaphore.acquire(); // 获取信号量,开始打印
for (int i = index; i < arr.length; i += 2) {
System.out.println(arr[i]);
}
semaphore.release(); // 打印完毕,释放信号量
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return null;
}
}
public void printArray() {
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < arr.length; i += 2) {
executor.submit(new PrintThread(i)); // 提交任务
}
executor.shutdown(); // 关闭线程池
}
public static void main(String[] args) {
PrintArray arrayPrinter = new PrintArray();
arrayPrinter.printArray();
}
}
```
在这个例子中,我们创建了一个`PrintThread`类作为 Callable 实现,并使用 `Semaphore` 控制每次只有一个线程能打印数组。当一个线程完成打印并释放信号量后,另一个线程才能获取并继续打印。
阅读全文