多线程并行请求问题及SplashActivity预加载问题解决方案
1. 问题描述(一):
现有3个线程thread1, thread2, thread3。这3个线程是并发执行的,当着3个线程都执行完成以后,需要执行一个finish()事件。
1.1 实现方法:
/** 定义一个静态标记 **/
private static byte nbTemp = 0; private void aa(){
// 线程1
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程2
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程3
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
}); thread1.start();
thread2.start();
thread3.start();
} /** 注意:要添加关键字“synchronized”,否则会先同时操作bb()方法 */
private synchronized void bb(){
nbTemp ++;
if(nbTemp == (byte)3) {
finish(); // 条件达成,执行finish();
}
}
1.2 其他实现方式:
2. 问题描述(二):
我们回到APP上,在APP启动时,我们会先启动Splash,会在Splash中做一些预加载。那么由于网速等等原因,导致预加载的时间不太固定。那么我们既不希望他加载的过快,会导致页面的存在感不强;也不希望加加载过慢,误以为“卡死”。那么我们就需要设置一个最小加载时间和最大加载时间。那么如何时间呢?
/** 定义一个静态标记 **/
private static byte nbTemp = 0;
/** 开始时候的时间戳 **/
private long nlStartTime;
/** 最大时间戳 **/
private long nlMaxTime;
/** finish()方法标记,防止多次执行 **/
private boolean isFirst;
/** 最小等待时间 **/
private short nsMinTime = 3000;
/** 最大等待时间 **/
private short nsMaxTime = 6000; private void aa(){
// 线程1
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程2
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程3
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
}); Thread threadTimeManager = new Thread(new Runnable() {
41 @Override
public void run() {
while(ture) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
nlStartTime += 1000;
if(nlCurrentTime < nlStartTime) {
nbTemp = 3;
50 bb();
51 return;
52 }
53 }
54 }
55 }); // 记录当前时间
nlStartTime = System.currentTimeMillis();
nlCurrentTime = nlStartTime - nsMaxTime + 1; // 最大间隔6s;
isFirst = true; thread1.start();
thread2.start();
thread3.start();
threadTimeManager.start();
} /** 主要要添加关键字“synchronized”,否则会先同时操作bb()方法 */
private synchronized void bb(){
nbTemp ++;
if(nbTemp > (byte)2 && isFirst) {
isFirst = false;
long nlEnd = nsMinTime + nlStartTime - System.currentTimeMillis();
if(nlEnd > 0 && nlEnd < nsMinTime) {
try {
76 Thread.sleep(nlEnd);
} catch (InterruptedException e) {}
78 } finish(); // 条件达成,执行finish();
}
}
多线程并行请求问题及SplashActivity预加载问题解决方案的更多相关文章
- 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理
FluentScheduler介绍 github地址:https://github.com/fluentscheduler/FluentScheduler FluentScheduler是一个简单的任 ...
- InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式
InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...
- Javascript图片预加载详解
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
- IIS初始化(预加载),解决第一次访问慢,程序池被回收问题
你以为你可以慢,那是不可能的!你以为你可以不动,那也是不可能的! 河南是守株待兔故事情节的发源地,讲的是懒惰的农夫坐在树桩旁等待可爱的小毛兔撞树的故事,那么这种事情怎么可能天天出现呢!你以为的事并一定 ...
- ViewPager+Fragment取消预加载(延迟加载)(转)
原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...
- js图片预加载
图片预加载有大体有几种方式 1.html标签或css加载图片. 显而易见我们使用img标签或者通过标签的background-image属性都可以实现图片的预加载.但是为了避免初次载入过多图片影响体验 ...
- 利用简洁的图片预加载组件提升h5移动页面的用户体验
在做h5移动页面,相信大家一定碰到过页面已经打开,但是里面的图片还未加载出来的情况,这种问题虽然不影响页面的功能,但是不利于用户体验.抛开网速的原因,解决这个问题有多方面的思路:最基本的,要从http ...
- ASP.NET MVC3 Razor 调试与预加载
目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载 在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...
- JS实现图片预加载无需等待
网站开发时经常需要在某个页面需要实现对大量图片的浏览;用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考 ...
随机推荐
- ScrollViewer - 可用鼠标拖动滚动的列表框
ScrollViewer添加附加属性: using System; using System.Collections.Generic; using System.Windows; using Syst ...
- 使用Spring实例化Bean的方法以及Bean取别名
一.通过构造方法实例化Bean bean中加构造方法 public class Bean1 { public Bean1() { System.out.println("Bean1构造方法. ...
- SSM项目启动的三种方式
SSM整合Maven项目的三种启动方式 项目部署如图: 1.从父工程的的tomcat插件中直接启动 2.从web子工程的tomcat插件中启动,(需要先执行父工程的install) 如果没有执行父工程 ...
- markdown怎么上传图片
将图片转为base64格式 , 在线转换地址link 语法格式 // 方式1  // 方式2 ![picture][img] [img]:base64密钥
- 1062 Talent and Virtue (25分)(水)
About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...
- C++头文件中的模板类
C++头文件中的模板类 这已经是我的第三篇关于头文件的博客了,没想到我还是踩了个巨坑. 大家都知道要在头文件里声明类成员,在源文件中实现. 但是今天写数据结构作业,在头文件(Stack.h)定义了一个 ...
- python部署-Flask+uwsgi+Nginx
一.Flask部分(app.py) flask即Python代码:部分参考代码如下,相信很多人如果看到这篇文章一定有flask的代码能力. from app import create_app fro ...
- 9.2ArrayList 集合 案例,学生管理系统
循环的使用 添加学生:while嵌套for,for设置变量,内嵌if更新变量.if语句判断变量值 修改学生:for循环内嵌if,获取循环中的某个值. package day9_ArrayList.AL ...
- matplotlib Transform
2020-04-09 15:09:02 -- Edit by yangray Transform 类是TransformNode的子类,它是所有执行变换的TransformNode的实例的基类.所有非 ...
- 超详细Go语言源码目录说明
开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎go home~ 导读 学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢?今天 ...