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 // 线程214 Thread thread2 = new Thread(new Runnable() {15 @Override16 public void run() {17 // ...18 bb();19 }20 });21 // 线程322 Thread thread3 = new Thread(new Runnable() {23 @Override24 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 // 线程116 Thread thread1 = new Thread(new Runnable() {17 @Override18 public void run() {19 // ...20 bb();21 }22 });23 // 线程224 Thread thread2 = new Thread(new Runnable() {25 @Override26 public void run() {27 // ...28 bb();29 }30 });31 // 线程332 Thread thread3 = new Thread(new Runnable() {33 @Override34 public void run() {35 // ...36 bb();37 }38 });39 40 Thread threadTimeManager = new Thread(new Runnable() {41 @Override42 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 }