异步转同步
异步转同步
CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
/*
初始化对象
数字1自己定,一般有几个需要同步的异步线程就设置为几
*/
CountDownLatch countDownLatch = new CountDownLatch(1);
//让异步线程执行完毕后进入等待
countDownLatch.await();
/*
实例化时的计数-1,计数为0时则唤醒所有阻塞的线程
就是说当你规定数量的异步线程都执行这一步后,主线程直接被唤醒
*/
countDownLatch.countDown();
例:有个公用变量,需要异步去执行改变其值,但是改变的值主线程还未获取到,就继续执行了,所以需要让主线程等待异步调用执行完毕后才继续往下走
代码如下:
public class Demo{
public static String str = "我没改变";
public static void main(String[] args){
Thread t = new Thread(new RunableDemo());
t.start();
for(int i=1; i<=10; i++){
System.out.println("第"+i+"次==>"+str);
}
}
}
public class RunnableDemo implements Runnable{
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
NonSyncDemo1.str = "我已改变";
}
}
可以看到str还没被改变程序就走完了
所以我们要利用CountDownLatch让这个异步操作转成同步
代码如下:
public class Demo{
public static String str = "我没改变";
public static CountDownLatch countdowLatch = new CountDownLatch(1);
public static void main(String[] args){
Thread t = new Thread(new RunableDemo());
t.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=1; i<=10; i++){
System.out.println("第"+i+"次==>"+str);
}
}
}
public class RunnableDemo implements Runnable{
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
NonSyncDemo1.str = "我已改变";
Demo.countDownLatch.countDown();
}
}
可以看到这次str是改变后再输出值了
大概的用法基本就是这样,本人小白一枚,如有说错,望各位踊跃指出,我好即时更正😊
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!