博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程并行请求问题及SplashActivity预加载问题解决方案
阅读量:4137 次
发布时间:2019-05-25

本文共 3238 字,大约阅读时间需要 10 分钟。

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 }

 

转载地址:http://irovi.baihongyu.com/

你可能感兴趣的文章
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
性能扩展问题要趁早
查看>>
MySQL-数据库、数据表结构操作(SQL)
查看>>
OpenLDAP for Windows 安装手册(2.4.26版)
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>