多线程并行请求问题及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 其他实现方式:
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 }