多线程并行请求问题及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来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考 ...
随机推荐
- 如何做监控?Google SRE 解密
监控值班室: @隔壁老王头 SQL执行耗时时间过长,达到了报警阈值[5000ms] 隔壁老王头: @监控值班室 少量报警请忽略,批量关注即可. 监控值班室: @隔壁老王头 订单号[88886666]状 ...
- STM32F103ZET6串口通信
1.电平标准 根据通讯使用的电平标准不同,串口通讯可分为TTL标准和RS-232标准,如下表: 从图中可以看到,TTL电平标准使用5V表示高电平,使用0V表示低电平.在R232电平标准中,为了增加串口 ...
- 原生js弹力球
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP的运行方式(SAPI)
PHP 常量 PHP_SAPI 具有和 php_sapi_name() 相同的值. define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== ...
- Vulnhub DC-2靶机渗透
信息搜集 nmap扫描端口 nmap -sV 192.168.146.140 -p1-10000 开了80端口,那就直接访问一下把.(7744端口是ssh端口,之后会用到) 输入ip,发现url处变成 ...
- C++静态库和动态库
静态库与动态库 首先简单介绍一下gcc 指令 ubuntu 下安装gcc g++ 方法 sudo apt install gcc g++ gcc 的简单使用 建立hello.c 源文件 gcc hel ...
- 34 io流-- 打印流和对象流
概述 io流分为字符流和字节流,具体分类相见下图 字符流:char 一些基本文本的数据传输 字节流:byte 图片.视频等用文本查看器查看不了的文件都是二进制文件,只能用字节流传输,使用字符流cp的看 ...
- hadoop(六)rsync远程同步|xsync集群分发(完全分布式准备三)|8
前置环境准备:centos7克隆ip|机器名|映射关系|别名配置(hadoop完全分布式准备一)scp命令copy文件和配置(hadoop完全分布式准备二) rsync远程同步工具 优点 rsync主 ...
- python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟
因为最近发现咪咕音乐版权好多,当时我就在想是不是可以爬取下来,然后花了一些时间,发现有加密,虽然找到了接口,但是只能手动下载VIP歌曲,对于我们学IT的人来说,这是不能忍的,于是就懒得去解密抓取了,但 ...
- 【python实现卷积神经网络】开始训练
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...