同步转异步
作者:互联网
同步转异步
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