多线程并行请求问题及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 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值