使用CountDownLatch同步Java多线程的完整攻略包括以下步骤:
什么是CountDownLatch
CountDownLatch是Java中的一个并发工具类,可以用于对多个线程之间的并发操作进行同步。当我们创建一个CountDownLatch对象,并指定一个计数器的值时,多个线程可以同时启动并执行任务,但是只有当计数器为0时,线程才能继续执行。
CountDownLatch的实现
CountDownLatch由一个计数器和两个方法组成:countDown和await。计数器初始值为我们指定的数量,每次调用countDown方法时,计数器的值减1。当计数器值为0时,await方法返回。
使用示例1:计算线程
下面是一个在多个线程中执行计算的示例,使用CountDownLatch实现同步。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchExample1 {
public static void main(String[] args) {
int nThreads = 5;
CountDownLatch latch = new CountDownLatch(nThreads);
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
for (int i = 0; i < nThreads; i++) {
executor.execute(() -> {
try {
System.out.println(Thread.currentThread().getName() + " is working...");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
});
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("All threads are finished.");
}
}
这段代码中,我们创建了5个线程,同时我们创建了一个CountDownLatch,指定了计数器的初始值为5。我们使用ExecutorService来启动线程,每个线程执行完毕后,都会调用CountDownLatch的countDown方法。在主线程中我们调用了await方法,使主线程等待所有的线程都执行完毕。当计数器的值减到0时,await方法返回,主线程继续执行。
使用示例2:并发HTTP请求
下面是一个在多个线程中执行HTTP请求的示例,使用CountDownLatch实现同步。
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchExample2 {
private static final int N_THREADS = 5;
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(N_THREADS);
ExecutorService executor = Executors.newFixedThreadPool(N_THREADS);
for (int i = 0; i < N_THREADS; i++) {
executor.execute(() -> {
try {
HttpURLConnection connection = (HttpURLConnection) new URL("http://www.baidu.com").openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
System.out.println(Thread.currentThread().getName() + " is finished. Response code: " + connection.getResponseCode());
} catch (IOException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
});
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("All requests are finished.");
}
}
这段代码中,我们创建了一个CountDownLatch,指定了计数器的初始值为5,这个值与我们创建的线程数量相同。我们使用ExecutorService来启动线程,每个线程执行完毕后,都会调用CountDownLatch的countDown方法。在主线程中我们调用了await方法,使主线程等待所有的线程都执行完毕。当计数器的值减到0时,await方法返回,主线程继续执行。
结论
CountDownLatch是Java中非常有用的一个并发工具类,可以用于对多个线程之间的并发操作进行同步。使用CountDownLatch可以方便地实现多线程等待和同步操作,避免了使用wait和notify等低级别的线程同步方法带来的风险和不便。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用CountDownLatch同步java多线程 - Python技术站