其他分享
首页 > 其他分享> > 同步转异步

同步转异步

作者:互联网

同步转异步

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

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

标签:异步,同步,Thread,线程,str,CountDownLatch,public
来源: https://www.cnblogs.com/lasucc/p/16065368.html