美文网首页
线程异步转同步

线程异步转同步

作者: 浩仔_Boy | 来源:发表于2021-02-23 16:07 被阅读0次

    学习笔记,仅供自己参考,如有不对欢迎指正

    5.T1、T2、T3三个线程,如何保证它们顺序执行?也就是异步转同步的方式。

    • 使用wait和notify方法
      wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。
      notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,notifyAll()是唤醒所有的线程。

    • 使用CountDownLatch
      具体实现:

    package com.zhboy.myapplication;
    
    import android.util.Log;
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @author zhou_hao
     * @date 2020/12/25
     * @description: 异步转同步的方式
     */
    public class AsyncQuery {
    
        private static final String LOGGER_NAME = AsyncQuery.class.getName();
    
        public void asyncQuery() {
            final CountDownLatch latch = new CountDownLatch(1);
    
            new Thread(() -> {
                int room = new Random().nextInt(10);
                try {
                    Thread.sleep(room * 100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d(LOGGER_NAME, "子线程" + Thread.currentThread().getName() + "执行完毕");
                latch.countDown();
            }).start();
    
            try {
                latch.await();//等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    

    测试:

      Log.d("AsyncQuery", "执行查询")
            for (i in 0..10){
                val asyncQuery = AsyncQuery()
                asyncQuery.asyncQuery()
            }
            Log.d("AsyncQuery", "查询结束-执行主线程")
    
    

    结果:

    image.png

    相关文章

      网友评论

          本文标题:线程异步转同步

          本文链接:https://www.haomeiwen.com/subject/zjwfxltx.html