异步转同步

异步转同步

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是改变后再输出值了

大概的用法基本就是这样,本人小白一枚,如有说错,望各位踊跃指出,我好即时更正😊

posted @   lasu  阅读(381)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示