• 多线程并行请求问题及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 }
  • 相关阅读:
    麒麟短线王实战技法
    Silverlight的资源
    Windows Live SkyDrive, Windows Live Sync 和 Live Mesh
    Listview.Subitem.BackColor.ForeColor改变字体颜色和背景
    windows mobile控制面板程序
    Windows Azure百度百科
    wcf中如何Host多个WCF服务?
    强弱跟踪
    修改默认的HTTP Response Header
    DataTable 内部索引已损坏
  • 原文地址:https://www.cnblogs.com/steffen/p/6638756.html
Copyright © 2020-2023  润新知