java中怎么保证两个线程全部交替执行完毕才执行接下来的代码
时间: 2024-04-30 08:24:21 浏览: 101
Java中可以使用CountDownLatch或者CyclicBarrier来保证两个线程全部交替执行完毕才执行接下来的代码。
CountDownLatch是一种同步工具类,它可以让一个或多个线程等待其他线程完成操作后再继续执行。在主线程中创建一个CountDownLatch对象并设置计数器初始值为2,然后将这个对象传递给两个线程。每个线程在执行完自己的任务后,调用CountDownLatch的countDown()方法,将计数器减1。主线程调用await()方法等待计数器变为0,表示两个线程已经全部执行完毕,可以继续执行接下来的代码。
示例代码如下:
```java
import java.util.concurrent.CountDownLatch;
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2); // 计数器初始值为2
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// 线程1执行的任务
latch.countDown(); // 计数器减1
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// 线程2执行的任务
latch.countDown(); // 计数器减1
}
});
thread1.start();
thread2.start();
latch.await(); // 等待计数器变为0
// 两个线程全部执行完毕,可以执行接下来的代码
}
}
```
CyclicBarrier也是一种同步工具类,它可以让多个线程在一个栅栏处等待,直到所有线程都到达栅栏位置后才能继续执行。在主线程中创建一个CyclicBarrier对象并设置等待线程数为2,然后将这个对象传递给两个线程。每个线程在执行完自己的任务后,调用CyclicBarrier的await()方法等待其他线程到达栅栏位置。当所有线程都到达栅栏位置后,栅栏会自动打开,所有线程可以继续执行接下来的代码。
示例代码如下:
```java
import java.util.concurrent.CyclicBarrier;
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(2); // 等待线程数为2
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// 线程1执行的任务
try {
barrier.await(); // 等待其他线程到达栅栏位置
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// 线程2执行的任务
try {
barrier.await(); // 等待其他线程到达栅栏位置
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread1.start();
thread2.start();
barrier.await(); // 等待所有线程到达栅栏位置
// 两个线程全部执行完毕,可以执行接下来的代码
}
}
```
阅读全文