zoukankan      html  css  js  c++  java
  • 多线程并行请求问题及SplashActivity预加载问题解决方案

    1. 问题描述(一):

           现有3个线程thread1, thread2, thread3。这3个线程是并发执行的,当着3个线程都执行完成以后,需要执行一个finish()事件。

     1.1 实现方法:

     1 /** 定义一个静态标记 **/
     2 private static byte nbTemp = 0;
     3 
     4 private void aa(){
     5     // 线程1
     6     Thread thread1 = new Thread(new Runnable() {
     7         @Override
     8         public void run() {
     9             // ...
    10             bb();
    11         }
    12     });
    13     // 线程2
    14     Thread thread2 = new Thread(new Runnable() {
    15         @Override
    16         public void run() {
    17             // ...
    18             bb();
    19         }
    20     });
    21     // 线程3
    22     Thread thread3 = new Thread(new Runnable() {
    23         @Override
    24         public void run() {
    25             // ...
    26             bb();
    27         }
    28     });
    29 
    30     thread1.start();
    31     thread2.start();
    32     thread3.start();
    33 }
    34 
    35 /** 注意:要添加关键字“synchronized”,否则会先同时操作bb()方法 */
    36 private synchronized void bb(){
    37     nbTemp ++;
    38     if(nbTemp == (byte)3) {
    39         finish(); // 条件达成,执行finish();
    40     }
    41 }

    1.2 其他实现方式:

    详见 ☞ Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

    2. 问题描述(二):

    我们回到APP上,在APP启动时,我们会先启动Splash,会在Splash中做一些预加载。那么由于网速等等原因,导致预加载的时间不太固定。那么我们既不希望他加载的过快,会导致页面的存在感不强;也不希望加加载过慢,误以为“卡死”。那么我们就需要设置一个最小加载时间和最大加载时间。那么如何时间呢?

     1 /** 定义一个静态标记 **/
     2 private static byte nbTemp = 0;
     3 /** 开始时候的时间戳 **/
     4 private long nlStartTime;
     5 /** 最大时间戳 **/
     6 private long nlMaxTime;
     7 /** finish()方法标记,防止多次执行 **/
     8 private boolean isFirst;
     9 /** 最小等待时间 **/
    10 private short nsMinTime = 3000;
    11 /** 最大等待时间 **/
    12 private short nsMaxTime = 6000;
    13 
    14 private void aa(){
    15     // 线程1
    16     Thread thread1 = new Thread(new Runnable() {
    17         @Override
    18         public void run() {
    19             // ...
    20             bb();
    21         }
    22     });
    23     // 线程2
    24     Thread thread2 = new Thread(new Runnable() {
    25         @Override
    26         public void run() {
    27             // ...
    28             bb();
    29         }
    30     });
    31     // 线程3
    32     Thread thread3 = new Thread(new Runnable() {
    33         @Override
    34         public void run() {
    35             // ...
    36             bb();
    37         }
    38     });
    39     
    40     Thread threadTimeManager = new Thread(new Runnable() {
    41         @Override
    42         public void run() {
    43             while(ture) {
    44                 try {
    45                     Thread.sleep(1000);
    46                 } catch (InterruptedException e) {}
    47                 nlStartTime += 1000;
    48                 if(nlCurrentTime < nlStartTime) {
    49                     nbTemp = 3;
    50                     bb();
    
    51 return;
    52
    } 53 } 54 } 55 }); 56 57 // 记录当前时间 58 nlStartTime = System.currentTimeMillis(); 59 nlCurrentTime = nlStartTime - nsMaxTime + 1; // 最大间隔6s; 60 isFirst = true; 61 62 thread1.start(); 63 thread2.start(); 64 thread3.start();
    65 threadTimeManager.start();
    66 } 67 68 /** 主要要添加关键字“synchronized”,否则会先同时操作bb()方法 */ 69 private synchronized void bb(){ 70 nbTemp ++; 71 if(nbTemp > (byte)2 && isFirst) { 72 isFirst = false; 73 long nlEnd = nsMinTime + nlStartTime - System.currentTimeMillis(); 74 if(nlEnd > 0 && nlEnd < nsMinTime) { 75 try { 76 Thread.sleep(nlEnd); 77 } catch (InterruptedException e) {} 78 } 79 finish(); // 条件达成,执行finish(); 80 } 81 }
  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/steffen/p/6638756.html
Copyright © 2011-2022 走看看